J'ai un formulaire avec le tag ng-submit="login()
La fonction est appelée correctement en javascript.
function LoginForm($scope, $http)
{
$http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
$scope.email = "[email protected]";
$scope.password = "1234";
$scope.login = function()
{
data = {
'email' : $scope.email,
'password' : $scope.password
};
$http.post('resources/curl.php', data)
.success(function(data, status, headers, config)
{
console.log(status + ' - ' + data);
})
.error(function(data, status, headers, config)
{
console.log('error');
});
}
}
Je reçois une réponse 200 OK du fichier PHP, cependant, les données renvoyées le disent email
et ne password
sont pas définies. C'est tout le php que j'ai
<?php
$email = $_POST['email'];
$pass = $_POST['password'];
echo $email;
?>
Une idée de pourquoi j'obtiens des POST
valeurs indéfinies ?
ÉDITER
Je voulais le souligner car cela semble être une question populaire (mais elle est ancienne), .success
et .error
a été obsolète et vous devriez utiliser .then
comme @James Gentes l'a souligné dans les commentaires
php
javascript
angularjs
Ronnie
la source
la source
$http
?Form-Data
il est dit{"email":"[email protected]","password":"1234"}
print_r($_POST);
puis essayezjson_decode()
le bon indexecho 'test';
fonctionne très bien. Je pointe certainement vers le bon fichierRéponses:
angularjs définit par
.post()
défaut l'en-tête Content-type surapplication/json
. Vous remplacez cela pour transmettre des données codées par formulaire, mais vous ne modifiez pas votredata
valeur pour transmettre une chaîne de requête appropriée, de sorte que PHP ne se remplit pas$_POST
comme prévu.Ma suggestion serait d'utiliser simplement le paramètre angularjs par défaut
application/json
comme en-tête, de lire l'entrée brute en PHP, puis de désérialiser le JSON.Cela peut être réalisé en PHP comme ceci:
Sinon, si vous comptez beaucoup sur la
$_POST
fonctionnalité, vous pouvez former une chaîne de requête comme[email protected]&password=somepassword
et l'envoyer sous forme de données. Assurez-vous que cette chaîne de requête est encodée en URL. S'il est construit manuellement (au lieu d'utiliser quelque chose commejQuery.serialize()
), JavascriptencodeURIComponent()
devrait faire l'affaire pour vous.la source
file_get_contents("php://input");
semble un peu comme un hack, non? Je n'en ai jamais entendu parler. Ce qui doit se passer pour que je puisse simplement le référencer comme$_POST['email'];
$_POST
elle ne sera pas remplie.Je le fais côté serveur, au début de mon fichier init, fonctionne comme un charme et vous n'avez rien à faire dans le code php angulaire ou existant:
la source
$_POST = (array) json_decode(file_get_contents('php://input'), true)
.$_POST
finirait par obtenir un tableau indexé numériquement dans ce cas, ce qui serait un comportement très inattendu dans une autre partie du système qui repose sur un$_POST
comportement super global cohérent .Dans l'API que je développe, j'ai un contrôleur de base et dans sa méthode __construct (), j'ai ce qui suit:
Cela me permet de simplement référencer les données json comme $ _POST ["var"] si nécessaire. Fonctionne très bien.
De cette façon, si un utilisateur authentifié se connecte à une bibliothèque telle que jQuery qui envoie des données de publication avec une valeur par défaut de Content-Type: application / x-www-form-urlencoded ou Content-Type: application / json, l'API répondra sans erreur et sera rendre l'API un peu plus conviviale pour les développeurs.
J'espère que cela t'aides.
la source
Parce que PHP n'accepte pas nativement JSON,
'application/json'
une approche consiste à mettre à jour vos en-têtes et vos paramètres à partir d'angular afin que votre api puisse utiliser les données directement.Tout d'abord , paramétrez vos données:
Ensuite , ajoutez ce qui suit à votre
$http
Si toutes vos requêtes vont à PHP, les paramètres peuvent être définis globalement dans la configuration comme suit:
la source
Code de démonstration Angular Js: -
Code côté serveur: -
En raison du comportement angulaire, il n'y a pas de méthode directe pour le comportement de publication normal sur le serveur PHP, vous devez donc le gérer dans des objets json.
la source
.success
et.error
sont obsolètes et ont été supprimées du framework AngularJS.Vous devez désérialiser vos données de formulaire avant de les transmettre comme deuxième paramètre à .post (). Vous pouvez y parvenir en utilisant la méthode $ .param (data) de jQuery. Ensuite, vous pourrez du côté serveur de le référencer comme $ .POST ['email'];
la source
C'est la meilleure solution (IMO) car elle ne nécessite aucun jQuery et aucun décodage JSON:
Source: https://wordpress.stackexchange.com/a/179373 et: https://stackoverflow.com/a/1714899/196507
Résumé:
Exemple:
Code PHP:
la source
JSON.stringify('{ id: 'some_id', name : 'some_name' }')
ou$httpParamSerializer
pour la conversion côté client?C'est une vieille question mais il vaut la peine de mentionner que dans Angular 1.4 $ httpParamSerializer est ajouté et lors de l'utilisation de $ http.post, si nous utilisons $ httpParamSerializer (params) pour passer les paramètres, tout fonctionne comme une demande de publication régulière et aucune désérialisation JSON n'est nécessaire côté serveur.
https://docs.angularjs.org/api/ng/service/$httpParamSerializer
la source
Cela m'a pris des heures pour comprendre cela tout en travaillant avec Angular et PHP. Les données de publication n'allaient pas vers PHP dans $ _POST
dans le code PHP, procédez comme suit. - Créez une variable $ angular_post_params - Ensuite, procédez comme suit
$angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));
maintenant vous pouvez accéder à vos paramètres comme vous le faites depuis $ _POST
$angular_http_params["key"]
au cas où vous vous poseriez des questions sur javascript .... c'est ce que j'ai utilisé
la source
.success
et.error
sont obsolètes et ont été supprimées du framework AngularJS.