2013-05-27 33 views
2

我有點難住下面,任何幫助表示讚賞。我已經刪除錯誤檢查什麼錯的這個例子代碼...

我運行PHP 5.4.14和使用PHP的服務器...

編輯:感謝來自阿爾瓦羅幫助我現在可以看到問題是$HTTP_RAW_POST_DATA實際上碰到了PHP開發服務器,但由於某種原因,它並未用於填充$_POST

JavaScript片段(從實際代碼採取這裏simplfied)當我點擊提交表單按鈕是被稱爲...

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

+0

這是我推薦的jQuery。讓生活更輕鬆。 – itachi

+0

據我所知,代碼中沒有任何內在錯誤。錯誤必須位於您省略的部分。作爲一般規則,'alert()'是一個糟糕的調試工具。使用Firebug或瀏覽器的等效工具檢查變量和HTTP請求。 –

+0

@Alvaro:謝謝你的回覆。是的同意'alert()'很笨拙!在'xmlhttp.send(params);'這行之後,這就是HTTP請求消失了嗎?從Javascript方面來說,如果'params'沒問題,任何東西都可能是錯的?在PHP方面,你有任何關於如何調試的建議嗎?我不知道如何調試,一旦由PHP服務器接收到的HTTP請求......是存在的,前例如,一個辦法看到HTTP請求作爲,如果與本地主機交談時,我會wiresharked呢?謝謝:) – Jimbo

回答

1

您的客戶端代碼正在發送一個POST請求(顯然)是預期數據作爲請求主體,並且信息到達PHP。但是,信息結束於$HTTP_RAW_POST_DATA而不是$_POST

always_populate_raw_post_data directive的手冊頁解釋了這個:

始終在$HTTP_RAW_POST_DATA包含原始POST 數據。 否則,變量僅與未識別 MIME類型的數據的填充。但是,訪問 原始POST數據的首選方法是php://輸入。 $ HTTP_RAW_POST_DATA不與ENCTYPE =「多部分/格式數據」可用 。

這提供了一個可能的解釋:PHP未能識別Content-Type請求標頭。

有在這個解釋建議PHP的bug跟蹤系統(POST values in Google Chrome XHR)的報告。原因可能是Google Chrome瀏覽器的功能與其他瀏覽器不同,而PHP的內置服務器無法處理它。我認爲你應該遵循這一研究路線。

+0

正確的你是...相同的PHP代碼和JavaScript通過IE瀏覽器運行...'$ _POST'正確填充。謝謝! – Jimbo

+0

我會迴應上面的第一條(非特定的)建議:使用jQuery。在過去的幾年裏,我從來沒有在任何瀏覽器中提交過Ajax請求的問題,僅僅爲了Ajax就值得。 – Jason

相關問題