Ich habe ein Formular mit dem Tag ng-submit="login()
Die Funktion wird in Javascript als fein bezeichnet.
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');
});
}
}
Ich erhalte eine 200-OK-Antwort von der PHP-Datei zurück, die zurückgegebenen Daten sagen dies jedoch email
und password
sind undefiniert. Das ist alles was ich habe
<?php
$email = $_POST['email'];
$pass = $_POST['password'];
echo $email;
?>
Irgendeine Idee, warum ich undefinierte POST
Werte erhalte ?
BEARBEITEN
Ich wollte darauf hinweisen, da dies eine beliebte Frage zu sein scheint (aber es ist alt) .success
und .error
veraltet ist und Sie verwenden sollten, .then
wie @James Gentes in den Kommentaren hervorhob
php
javascript
angularjs
Ronnie
quelle
quelle
$http
?Form-Data
es sagt{"email":"[email protected]","password":"1234"}
print_r($_POST);
und dann versuchen Siejson_decode()
auf dem richtigen Indexecho 'test';
funktioniert gut. Ich zeige auf jeden Fall auf die richtige DateiAntworten:
angularjs verwendet
.post()
standardmäßig den Header für den Inhaltstypapplication/json
. Sie überschreiben dies, um formularcodierte Daten zu übergeben. Sie ändern jedoch nicht Ihrendata
Wert, um eine geeignete Abfragezeichenfolge zu übergeben, sodass PHP nicht$_POST
wie erwartet ausgefüllt wird.Mein Vorschlag wäre, einfach die Standardeinstellung anglejs von
application/json
als Header zu verwenden, die Roheingabe in PHP zu lesen und dann den JSON zu deserialisieren.Das kann in PHP so erreicht werden:
Wenn Sie sich stark auf
$_POST
Funktionalität verlassen, können Sie alternativ eine Abfragezeichenfolge wie diese bilden[email protected]&password=somepassword
und diese als Daten senden. Stellen Sie sicher, dass diese Abfragezeichenfolge URL-codiert ist. WennjQuery.serialize()
Javascript manuell erstellt wird (im Gegensatz zur Verwendung von etwas Ähnlichem ),encodeURIComponent()
sollte es den Trick für Sie tun.quelle
file_get_contents("php://input");
scheint eine Art Hack zu sein, nicht wahr? Ich habe noch nie davon gehört. Was muss passieren, damit ich es einfach so referenzieren kann$_POST['email'];
$_POST
die nicht ausgefüllt werden.Ich mache es auf der Serverseite, am Anfang meiner Init-Datei, funktioniert wie ein Zauber und Sie müssen nichts in eckigem oder vorhandenem PHP-Code tun:
quelle
$_POST = (array) json_decode(file_get_contents('php://input'), true)
.$_POST
würde in diesen Fällen ein numerisch indiziertes Array erhalten, was in anderen Teilen des Systems, die auf einem konsistenten$_POST
superglobalen Verhalten beruhen, ein sehr unerwartetes Verhalten wäre.In der API, die ich entwickle, habe ich einen Basis-Controller und in seiner __construct () -Methode habe ich Folgendes:
Dadurch kann ich die JSON-Daten bei Bedarf einfach als $ _POST ["var"] referenzieren. Funktioniert super.
Auf diese Weise antwortet die API fehlerfrei und reagiert, wenn sich ein authentifizierter Benutzer mit einer Bibliothek wie einer jQuery verbindet, die Post-Daten mit dem Standardwert Inhaltstyp: application / x-www-form-urlencoded oder Inhaltstyp: application / json sendet Machen Sie die API etwas entwicklerfreundlicher.
Hoffe das hilft.
quelle
Da PHP JSON nicht nativ akzeptiert
'application/json'
Ein Ansatz besteht darin, Ihre Header und Parameter aus dem Winkel zu aktualisieren, damit Ihre API die Daten direkt verwenden kann.Erstens , Parametrieren Ihre Daten:
Fügen Sie dann Folgendes zu Ihrem hinzu
$http
Wenn alle Ihre Anforderungen an PHP gehen, können die Parameter in der Konfiguration wie folgt global festgelegt werden:
quelle
Angular Js Demo Code: -
Serverseitiger Code: -
Aufgrund des Winkelverhaltens gibt es keine direkte Methode für das normale Post-Verhalten auf dem PHP-Server. Sie müssen es daher in JSON-Objekten verwalten.
quelle
.success
und.error
sind veraltet und wurden aus dem AngularJS-Framework entfernt.Sie müssen Ihre Formulardaten deserialisieren, bevor Sie sie als zweiten Parameter an .post () übergeben. Sie können dies mit der $ .param (data) -Methode von jQuery erreichen. Dann können Sie auf der Serverseite darauf verweisen, wie $ .POST ['email'];
quelle
Dies ist die beste Lösung (IMO), da keine jQuery und keine JSON-Dekodierung erforderlich sind:
Quelle: https://wordpress.stackexchange.com/a/179373 und: https://stackoverflow.com/a/1714899/196507
Zusammenfassung:
Beispiel:
PHP-Code:
quelle
JSON.stringify('{ id: 'some_id', name : 'some_name' }')
oder$httpParamSerializer
für die clientseitige Konvertierung?Es ist eine alte Frage, aber es ist erwähnenswert, dass in Angular 1.4 $ httpParamSerializer hinzugefügt wird. Wenn Sie $ http.post verwenden und $ httpParamSerializer (params) verwenden, um die Parameter zu übergeben, funktioniert alles wie eine reguläre Post-Anfrage und keine JSON-Deserialisierung auf der Serverseite benötigt.
https://docs.angularjs.org/api/ng/service/$httpParamSerializer
quelle
Ich habe Stunden gebraucht, um das zu verstehen, während ich mit Angular und PHP gearbeitet habe. Post-Daten gingen in $ _POST nicht an PHP
Gehen Sie im PHP-Code wie folgt vor. - Erstellen Sie eine Variable $ angle_post_params. - Führen Sie dann die folgenden Schritte aus
$angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));
Jetzt können Sie wie in $ _POST auf Ihre Parameter zugreifen
$angular_http_params["key"]
Für den Fall, dass Sie sich über Javascript wunderten ... das habe ich verwendet
quelle
.success
und.error
sind veraltet und wurden aus dem AngularJS-Framework entfernt.