К сожалению, этот ответ здесь @EatOng это не правильно . Прочитав его ответ, я добавил фиктивную переменную к каждому запросу AJAX, который я запускал (даже если у некоторых из них уже были поля), чтобы убедиться, что ошибка никогда не появится.
Но только сейчас наткнулся на ту же чертову ошибку PHP. Я дважды подтвердил, что отправил некоторые данные POST (также некоторые другие поля вместе с фиктивной переменной). Версия PHP 5.6.25
, always_populate_raw_post_data
установлено значение 0
.
Кроме того, когда я отправляю application/json
запрос, PHP не заполняет его $_POST
, а мне нужно json_decode()
необработанное тело запроса POST, доступное через php://input
.
Как ответил @ rr-cites,
0 / выкл / что угодно: поведение 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
из тела POSTed (потому что PHP любит / распознает эти content-type
заголовки !?).
ВАРИАНТ 4: ПОСЛЕДНИЙ КУРОРТ
Что ж, я не хотел менять Content-Type
AJAX, это вызвало бы много проблем при отладке. (Chrome DevTools прекрасно просматривает переменные POSTed запросов 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;
}