2

私は次のことに少し困惑しています。この例のエラーチェックコードは削除しました...

私はPHP 5.4.14を実行していて、PHPサーバーを使用しています...

編集: Álvaro の助けのおかげで、PHP 開発サーバーに実際にアクセスすることが問題であることがわかりました$HTTP_RAW_POST_DATAが、何らかの理由で$_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パラメーターが問題ないことがわかります。

その後、POST 要求はスクリプトに正しくヒットしますが、$_REQUEST配列のエラー ログ (および$_POST) によって空の配列が返されます。$_REQUEST/_POSTスクリプトを入力するとすぐに、のエラー ログが作成されます。

私のスクリプトが応答し、javascript が応答を取得できます...しかし、もちろん、私のスクリプトが返すことができるのはエラー コードだけです...おお。

なぜこれが当てはまるのでしょうか?

編集: Álvaro G. 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 スクリプトが実行されます...スクリプトの最初の 2 行は...

<?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

4

1 に答える 1

1

クライアント側のコードは、要求本文として (明らかに) 期待されるデータを含む POST 要求を送信しており、情報は PHP に到達します。ただし、情報は$HTTP_RAW_POST_DATAではなく になり$_POSTます。

always_populate_raw_post_dataディレクティブのマニュアルページでは、次のように説明されています。

$HTTP_RAW_POST_DATA生の POST データを含む を常に入力します。それ以外の場合、認識されない MIME タイプのデータのみが変数に入力されます。ただし、生の POST データにアクセスするための推奨される方法は php://input です。enctype="multipart/form-data" では $HTTP_RAW_POST_DATA を使用できません。

これは考えられる説明を提供します: PHP がContent-Typeリクエストヘッダーを認識できません。

PHP バグ トラッカー ( Google Chrome XHR の POST 値) には、この説明が提案されているレポートがあります。その理由は、Google Chrome が他のブラウザーとは異なることを行い、PHP の組み込みサーバーがそれを処理できないことが考えられます。私はあなたがこの一連の研究に従うべきだと思います。

于 2013-05-27T16:28:02.910 に答える