Saya memiliki formulir dengan tag ng-submit="login()
Fungsi ini dipanggil dengan baik dalam 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');
});
}
}
Saya mendapatkan respons 200 OK kembali dari file PHP, namun, data yang dikembalikan mengatakan itu email
dan password
tidak ditentukan. Ini semua php yang saya miliki
<?php
$email = $_POST['email'];
$pass = $_POST['password'];
echo $email;
?>
Adakah ide mengapa saya mendapatkan POST
nilai yang tidak terdefinisi ?
EDIT
Saya ingin menunjukkan karena ini sepertinya pertanyaan yang populer (namun sudah lama), .success
dan .error
sudah usang dan Anda harus menggunakan .then
seperti yang ditunjukkan @James Gentes di komentar
php
javascript
angularjs
Ronnie
sumber
sumber
$http
?Form-Data
bawahnya tertulis{"email":"[email protected]","password":"1234"}
print_r($_POST);
dan kemudian cobajson_decode()
pada indeks yang benarecho 'test';
bekerja dengan baik. Saya pasti menunjuk ke file yang benarJawaban:
angularjs
.post()
default header tipe konten keapplication/json
. Anda menimpa ini untuk meneruskan data yang dikodekan formulir, namun Anda tidak mengubahdata
nilai Anda untuk meneruskan string kueri yang sesuai, sehingga PHP tidak terisi$_POST
seperti yang Anda harapkan.Saran saya adalah dengan hanya menggunakan pengaturan default angularjs
application/json
sebagai header, membaca input mentah di PHP, dan kemudian deserialize JSON.Itu bisa dicapai dalam PHP seperti ini:
Bergantian, jika Anda sangat bergantung pada
$_POST
fungsionalitas, Anda bisa membentuk string kueri seperti[email protected]&password=somepassword
dan mengirimkannya sebagai data. Pastikan string kueri ini dikodekan URL. Jika dibuat secara manual (sebagai lawan menggunakan sesuatu sepertijQuery.serialize()
), JavascriptencodeURIComponent()
harus melakukan trik untuk Anda.sumber
file_get_contents("php://input");
sepertinya semacam retasan, bukan? Saya belum pernah mendengar tentang ini. Apa yang perlu terjadi jadi saya bisa mereferensikannya seperti$_POST['email'];
$_POST
tidak akan diisi.Saya melakukannya di sisi server, pada awal file init saya, berfungsi seperti pesona dan Anda tidak perlu melakukan apa pun dalam kode php bersudut atau yang sudah ada:
sumber
$_POST = (array) json_decode(file_get_contents('php://input'), true)
.$_POST
pada akhirnya akan mendapatkan array yang diindeks secara numerik dalam kasus ini, sesuatu yang akan menjadi perilaku yang sangat tidak terduga di bagian lain dari sistem yang mengandalkan$_POST
perilaku superglobal yang konsisten .Dalam API yang saya kembangkan, saya memiliki pengontrol dasar dan di dalam metode __construct () saya memiliki yang berikut ini:
Hal ini memungkinkan saya untuk mereferensikan data json sebagai $ _POST ["var"] saat diperlukan. Bekerja dengan baik.
Dengan cara itu jika pengguna yang diautentikasi terhubung dengan pustaka seperti jQuery yang mengirimkan data posting dengan default Jenis Konten: application / x-www-form-urlencoded atau Jenis Konten: application / json, API akan merespons tanpa kesalahan dan akan buat API sedikit lebih ramah pengembang.
Semoga ini membantu.
sumber
Karena PHP tidak secara asli menerima JSON,
'application/json'
satu pendekatan adalah memperbarui header dan parameter Anda dari sudut sehingga api Anda dapat menggunakan data secara langsung.Pertama , Parameterkan data Anda:
Kemudian , tambahkan yang berikut ini ke file
$http
Jika semua permintaan Anda mengarah ke PHP, parameternya dapat disetel secara global dalam konfigurasi sebagai berikut:
sumber
Kode Demo Angular Js: -
Kode Sisi Server: -
Karena perilaku sudut tidak ada metode langsung untuk perilaku posting normal di server PHP, jadi Anda harus mengelolanya di objek json.
sumber
.success
dan.error
tidak digunakan lagi dan telah dihapus dari kerangka kerja AngularJS.Anda perlu melakukan deserialisasi data formulir Anda sebelum meneruskannya sebagai parameter kedua ke .post (). Anda dapat mencapai ini menggunakan metode $ .param (data) jQuery. Kemudian Anda akan dapat di sisi server untuk mereferensikannya seperti $ .POST ['email'];
sumber
Ini adalah solusi terbaik (IMO) karena tidak memerlukan jQuery dan tidak ada decode JSON:
Sumber: https://wordpress.stackexchange.com/a/179373 dan: https://stackoverflow.com/a/1714899/196507
Ringkasan:
Contoh:
Kode PHP:
sumber
JSON.stringify('{ id: 'some_id', name : 'some_name' }')
atau$httpParamSerializer
untuk konversi sisi klien?Ini adalah pertanyaan lama tetapi perlu disebutkan bahwa di Angular 1.4 $ httpParamSerializer ditambahkan dan saat menggunakan $ http.post, jika kita menggunakan $ httpParamSerializer (params) untuk meneruskan parameter, semuanya berfungsi seperti permintaan posting biasa dan tidak ada deserialisasi JSON dibutuhkan di sisi server.
https://docs.angularjs.org/api/ng/service/$httpParamSerializer
sumber
Butuh waktu berjam-jam untuk memahami hal itu saat bekerja dengan Angular dan PHP. Data posting tidak akan PHP di $ _POST
dalam kode PHP lakukan hal berikut. - Buat variabel $ angular_post_params - Kemudian lakukan hal berikut
$angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));
sekarang Anda dapat mengakses parameter Anda seperti yang Anda lakukan dari $ _POST
$angular_http_params["key"]
jika Anda bertanya-tanya tentang javascript .... inilah yang saya gunakan
sumber
.success
dan.error
tidak digunakan lagi dan telah dihapus dari kerangka kerja AngularJS.