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

Posted

技术标签:

【中文标题】使用 Chrome + XHR 时未定义 PHP POST 变量【英文标题】:PHP POST variable not defined when using Chrome + XHR 【发布时间】:2012-12-17 02:10:36 【问题描述】:

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

HTTP-POST XHR not working in 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);
?>

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

<form action="scriptName.php" method="post">
      Field: <input type="text" name="myField"><br>
      <input type="submit" value="Submit">
</form>

客户端 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>

输出

在所有情况下,请求正文数据 (php://input) 返回相同的值。 标头大多相同,但 Chrome 在 XHR 模式下添加了 [HTTP_PRAGMA] =&gt; no-cache

$_POST 变量定义为 [myField] =&gt; test,Chrome + XHR 的情况除外。

问题

问题可能发生在哪里? HTTP标头是否有问题,或者我应该查看服务器端。有什么想法吗?

【问题讨论】:

何时调用postToURL() 从按钮onClick事件调用。 你能给我们看看吗? [HTTP_CONTENT_LENGTH] 标头在所有情况下都相同(myField=test 时为 12)。我将尝试手动定义它,看看是否会改变行为。 @ithcy:很高兴知道这不是通用的 Chrome 错误。我的测试环境有限。我正在使用带有内置开发网络服务器的 Chrome 23.0、PHP 5.4.10。我可以升级到 24.0 测试版,看看会发生什么;我开始觉得问题出在服务器端。 【参考方案1】:

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

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

以及页面最后一行的代码

<!-- Ignore Header Sent Error -->
<?php ob_flush(); ?>
<!-- Ignore Header Sent Error -->

希望对你有帮助

【讨论】:

以上是关于使用 Chrome + XHR 时未定义 PHP POST 变量的主要内容,如果未能解决你的问题,请参考以下文章

在 Chrome 中的 XHR 中设置断点

在 Chrome 中的 XHR 中设置断点

在 iframe 中使用 ajax 调用时未定义 xhttp

如何使用 chrome-extension 收听 xhr 响应?

使用 Chrome API 时未选中 runtime.lastError

在 Chrome 中捕获 XHR / Ajax 请求