不幸的是,@ 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行为(如果未注册content-type或请求方法不是POST,则填充)。
因为request方法是确定的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很好地查看了JSON请求的POSTed变量。)
我正在为客户端开发此东西,不能要求他们使用最新的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;
}