PHP开发服务器:$ HTTP_RAW_POST_DATA没有填充$ _POST ......怎么来的?

时间:2013-05-27 14:08:51

标签: php javascript ajax

我对以下内容感到有点困惑,任何帮助表示赞赏。我已经删除了错误检查代码,这个例子出现了什么问题...

我正在运行PHP 5.4.14并使用PHP服务器......

编辑:感谢Álvaro的帮助我现在可以看到问题是$HTTP_RAW_POST_DATA实际上确实击中了PHP开发服务器,但由于某种原因它不习惯填充$_POST

单击表单提交按钮时调用的JavaScript代码片段(取自真实代码并在此处简化)是...

xmlhttp = new XMLHttpRequest();

<snip>
params = 
    "forename=" + encodeURIComponent(form.forename.value) + "&" + 
    "surname="  + encodeURIComponent(form.surname.value)  + "&" +   
    "nonce="    + encodeURIComponent(form.nonce.value);


<snip>
xmlhttp.open("POST", url, false);

<snip>
if (xmlhttp.overrideMimeType) 
{
    xmlhttp.overrideMimeType('text/html');
}
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "close");

alert(params);
xmlhttp.send(params);

alert我可以看到params没问题。

POST请求然后正确地命中我的脚本,但是$_REQUEST数组(以及$_POST)的错误日志给了我一个空数组。我输入脚本后立即完成$_REQUEST/_POST的错误日志。

我的脚本回复,javascript可以回复...但当然我的所有脚本都可以返回错误代码... doh。

为什么会出现这种情况?

编辑:感谢ÁlvaroG。Vicario迄今为止的帮助。现在我可以看到请求确​​实离开了浏览器。

Request URL:http://localhost:8000/php_database/search_member.php
Request Method:POST
Status Code:200 OK
Request Headers
    POST /php_database/search_member.php HTTP/1.1
    Host: localhost:8000
    Connection: keep-alive
    Content-Length: 69
    Origin: http://localhost:8000
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
    Content-type: application/x-www-form-urlencoded
    Accept: */*
    Referer: http://localhost:8000/php_database/db_search.php
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: en-US,en;q=0.8
    Cookie: PHPSESSID=954ebbfadb841ef659a3961a44d715871bdedbaa
Form Data
    forename=ss&surname=dd&nonce=6c3e75f500dffdbfefe95d91710432dd8fd23fab
Response Headers
    HTTP/1.1 200 OK
    Host: localhost:8000
    Connection: close
    X-Powered-By: PHP/5.4.14
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Content-type: text/xml

PHP脚本运行......脚本的前两行是......

<?php
   $DEBUG = TRUE;
   if($DEBUG){ error_log("\n\n\n", 0); error_log("\n\n> SEARCH MEMBER SCRIPT", 0); }
   error_log(print_r($_REQUEST, TRUE), 0);

记录输出...

 > SEARCH MEMBER SCRIPT
[Mon May 27 15:42:22 2013] Array
(
)

如果我为$_POST添加另一张照片,则相同......

如果我遵循...评论,只是让我的脚本打印出一些全局...

我得到以下

array(0) {
}
array(0) {
}
array(0) {
}
array(25) {
  ["DOCUMENT_ROOT"]=>
  string(7) "C:\TJJT"
  ["REMOTE_ADDR"]=>
  string(3) "::1"
  ["REMOTE_PORT"]=>
  string(5) "59543"
  ["SERVER_SOFTWARE"]=>
  string(29) "PHP 5.4.14 Development Server"
  ["SERVER_PROTOCOL"]=>
  string(8) "HTTP/1.1"
  ["SERVER_NAME"]=>
  string(9) "localhost"
  ["SERVER_PORT"]=>
  string(4) "8000"
  ["REQUEST_URI"]=>
  string(31) "/php_database/search_member.php"
  ["REQUEST_METHOD"]=>
  string(4) "POST"
  ["SCRIPT_NAME"]=>
  string(31) "/php_database/search_member.php"
  ["SCRIPT_FILENAME"]=>
  string(38) "C:\TJJT\php_database\search_member.php"
  ["PHP_SELF"]=>
  string(31) "/php_database/search_member.php"
  ["HTTP_HOST"]=>
  string(14) "localhost:8000"
  ["HTTP_CONNECTION"]=>
  string(10) "keep-alive"
  ["HTTP_CONTENT_LENGTH"]=>
  string(2) "75"
  ["HTTP_ORIGIN"]=>
  string(21) "http://localhost:8000"
  ["HTTP_USER_AGENT"]=>
  string(108) "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36"
  ["HTTP_CONTENT_TYPE"]=>
  string(33) "application/x-www-form-urlencoded"
  ["HTTP_ACCEPT"]=>
  string(3) "*/*"
  ["HTTP_REFERER"]=>
  string(48) "http://localhost:8000/php_database/db_search.php"
  ["HTTP_ACCEPT_ENCODING"]=>
  string(17) "gzip,deflate,sdch"
  ["HTTP_ACCEPT_LANGUAGE"]=>
  string(14) "en-US,en;q=0.8"
  ["HTTP_COOKIE"]=>
  string(50) "PHPSESSID=b1e2eb2ba3d687bfeadee6bc17e1b994c214cd3a"
  ["REQUEST_TIME_FLOAT"]=>
  float(1369666751.2246)
  ["REQUEST_TIME"]=>
  int(1369666751)
}
string(75) "forename=xfvz&surname=zxcvzx&nonce=276083038fdd9a932ff06b94e5786fdd840873a4"

在上面的底部我可以清楚地看到......

string(75) "forename=xfvz&surname=zxcvzx&nonce=276083038fdd9a932ff06b94e5786fdd840873a4"

哇。所以$HTTP_RAW_POST_DATA实际上确实击中了PHP开发服务器......但由于某种原因,它不会用于填充$_POST

1 个答案:

答案 0 :(得分:1)

您的客户端代码正在发送一个POST请求(显然)作为请求正文的预期数据,并且信息到达PHP。但是,信息最终在$HTTP_RAW_POST_DATA而不是$_POST

always_populate_raw_post_data directive的手册页解释了这一点:

  

始终填充包含原始POST的$HTTP_RAW_POST_DATA   数据。 否则,仅使用无法识别的变量填充变量   数据的MIME类型。但是,访问的首选方法   原始POST数据是php:// input。 $ HTTP_RAW_POST_DATA不可用   使用enctype =“multipart / form-data”。

这提供了一个可能的解释:PHP无法识别Content-Type请求标头。

PHP错误跟踪器(POST values in Google Chrome XHR)中有一个报告,其中提供了此解释。原因可能是谷歌浏览器做了与其他浏览器不同的事情,PHP的内置服务器无法处理它。我认为你应该遵循这一系列研究。