Sayangnya, jawaban @EatOng ini salah . Setelah membaca jawabannya, saya menambahkan variabel dummy ke setiap permintaan AJAX yang saya aktifkan (bahkan jika beberapa di antaranya sudah memiliki beberapa bidang) hanya untuk memastikan kesalahan tidak pernah muncul.
Tapi sekarang saya menemukan kesalahan yang sama dari PHP. Saya mengkonfirmasi dua kali bahwa saya telah mengirim beberapa data POST (beberapa bidang lain juga bersama dengan variabel dummy). Versi PHP 5.6.25
, always_populate_raw_post_data
nilai ditetapkan ke 0
.
Juga, saat saya mengirim application/json
permintaan, PHP tidak mengisinya $_POST
, melainkan saya harus ke json_decode()
badan permintaan POST mentah, dapat diakses oleh php://input
.
Sebagai jawaban dari @ rr- cites,
0 / off / apa saja: perilaku BC (terisi jika tipe konten tidak terdaftar atau metode permintaan selain POST ).
Karena metode permintaan pasti POST, saya kira PHP tidak mengenali / menyukai Content-Type: application/json
permintaan saya (sekali lagi, mengapa ??).
PILIHAN 1:
Edit php.ini
file secara manual dan setel variabel pelakunya ke -1
, seperti yang disarankan oleh banyak jawaban di sini.
PILIHAN 2:
Ini adalah bug PHP 5.6. Tingkatkan PHP.
OPSI 3:
Seperti yang dijawab oleh @ user9541305 di sini, mengubah Content-Type
permintaan AJAX menjadi application/x-www-form-urlencoded
atau multipart/form-data
akan membuat PHP mengisi $_POST
dari badan POSTed (karena PHP menyukai / mengenali content-type
header tersebut !?).
OPSI 4: RESOR TERAKHIR
Yah, saya tidak ingin mengubah Content-Type
AJAX, itu akan menyebabkan banyak masalah untuk debugging. (Chrome DevTools melihat dengan baik variabel POST dari permintaan JSON.)
Saya mengembangkan hal ini untuk klien dan tidak dapat meminta mereka untuk menggunakan PHP terbaru, atau mengedit file php.ini. Sebagai upaya terakhir, saya hanya akan memeriksa apakah sudah diatur 0
dan jika demikian, edit php.ini
file dalam skrip PHP saya itu sendiri. Tentu saja saya harus meminta pengguna untuk merestart apache. Sayang sekali!
Berikut ini contoh kode:
<?php
if(ini_get('always_populate_raw_post_data') != '-1')
{
// Get the path to php.ini file
$iniFilePath = php_ini_loaded_file();
// Get the php.ini file content
$iniContent = file_get_contents($iniFilePath);
// Un-comment (if commented) always_populate_raw_post_data line, and set its value to -1
$iniContent = preg_replace('~^\s*;?\s*always_populate_raw_post_data\s*=\s*.*$~im', 'always_populate_raw_post_data = -1', $iniContent);
// Write the content back to the php.ini file
file_put_contents($iniFilePath, $iniContent);
// Exit the php script here
// Also, write some response here to notify the user and ask to restart Apache / WAMP / Whatever.
exit;
}