使用Chrome + XHR时未定义PHP POST变量

nic*_*las 7 javascript php google-chrome xmlhttprequest

这个问题几乎与一年前未回答的问题相同:

HTTP-POST XHR无法在chrome中运行.

我希望找到一个解决方案,并提供比原始问题更多的细节.

背景

我有一个服务器端的PHP脚本应该从表单或XHR请求中获取POST数据.当我使用提交表单测试网站时,它适用于Chrome和IE9.但是,当我使用XHR生成请求时,在客户端使用Chrome时,未定义php POST变量.这种行为是不一致的:在20次尝试中大约有1次,php确实接受了这些数据.

我检查了php://input流,发现在所有情况下都将帖子数据发送到服务器; 并注意到一小部分HTTP头($_SERVER)在测试用例之间是不同的.

服务器端:

<?php
   echo file_get_contents("php://input") . "\n";
   print_r($_SERVER);
   print_r($_POST);
?>
Run Code Online (Sandbox Code Playgroud)

客户端表单版本(Chrome和IE9都可以使用)

<form action="scriptName.php" method="post">
      Field: <input type="text" name="myField"><br>
      <input type="submit" value="Submit">
</form>
Run Code Online (Sandbox Code Playgroud)

客户端XHR版本(IE9始终有效,Chrome工作时间约为5%)

<script>
function postToURL(url,data)
{
  // Typical XHLHttpRequest declarations are removed for brevity
  //  - checks browser type and declares xmlhttp accordingly
  //  - defines a onreadystatechange handle

    xmlhttp.open("POST",url,false);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send(data);
}
</script>
...
<form>
<button type="button" onClick="postToURL('scriptname.php','myField=test');">
Test
</button>
</form>
Run Code Online (Sandbox Code Playgroud)

产量

在所有情况下,请求主体data(php://input)返回相同的值.标题大致相同,但Chrome [HTTP_PRAGMA] => no-cache在XHR模式下添加了一个

$_POST变量被定义为[myField] => test除了在Chrome + XHR情况.

问题

可能出现的问题在哪里?HTTP标头可能有问题,或者我应该看服务器端.有任何想法吗?

Amr*_*ero 1

将此代码放在页面的第一行

<?php ob_start(); error_reporting(E_ALL & ~E_NOTICE & ~8192); ?>
<!-- Ignore Errors , Header Sent Report -->
Run Code Online (Sandbox Code Playgroud)

这段代码位于页面的最后一行

<!-- Ignore Header Sent Error -->
<?php ob_flush(); ?>
<!-- Ignore Header Sent Error -->
Run Code Online (Sandbox Code Playgroud)

我希望这对你有帮助