На жаль, ця відповідь від @EatOng не є правильною . Прочитавши його відповідь, я додав змінну манекена до кожного запиту AJAX, який я запускав (навіть якщо у деяких з них вже були деякі поля), щоб переконатися, що помилка ніколи не з’являється.
Але тільки що я натрапив на ту саму прокляту помилку від PHP. Я подвійно підтвердив, що я надіслав деякі дані POST (деякі інші поля теж разом із змінною фіктивних даних). Версія PHP 5.6.25
, always_populate_raw_post_data
значення встановлено у 0
.
Крім того, оскільки я надсилаю application/json
запит, PHP не заповнює його $_POST
, скоріше я повинен json_decode()
переглядати необроблений орган запиту POST, доступний для php://input
.
Як відповідь @ rr- цитує,
0 / off / будь що: поведінка BC (заповнити, якщо тип вмісту не зареєстрований або метод запиту відрізняється від POST ).
Оскільки метод запиту точно POST, я думаю, PHP не розпізнав / не подобається моєму Content-Type: application/json
запиту (знову ж таки, чому ??).
ВАРІАНТ 1:
Відредагуйте php.ini
файл вручну та встановіть змінну винуватця на -1
, як свідчить багато відповідей тут.
ВАРІАНТ 2:
Це помилка PHP 5.6 Оновіть PHP.
ВАРІАНТ 3:
Як @ user9541305 відповів тут, змінивши Content-Type
запит AJAX на application/x-www-form-urlencoded
або multipart/form-data
зробить PHP заповненням $_POST
з тіла, що розміщено (оскільки PHP любить / розпізнає ціcontent-type
заголовки !?).
ВАРІАНТ 4: ОСТАННІЙ РЕЗОРТ
Ну, я не хотів змінювати Content-Type
AJAX, це спричинило б багато проблем для налагодження. (Chrome DevTools чудово переглядає розміщені змінні запитів JSON.)
Я розробляю цю річ для клієнта і не можу попросити їх використовувати останні PHP, а також редагувати файл php.ini. В крайньому випадку я просто перевіряю, чи встановлено це0
і якщо так, відредагуйтеphp.ini
файл у моєму PHP-скрипті. Звичайно, мені доведеться попросити користувача перезапустити apache. Який сором!
Ось зразок коду:
<?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;
}