2012-06-26 48 views
9

我有一個非常令人沮喪的問題,我無法檢索任何標題。這是我的代碼:PHP奇怪的未定義的索引錯誤

$headers = getallheaders(); 
echo($headers["SystemTime"]); //Doesnt work 
$keys = array_keys($headers); 
echo($headers[$keys[4]]); //Doesnt work 

兩行都會產生錯誤'未定義索引:SystemTime'。

我不能爲我的生命弄清楚爲什麼我不能得到的價值。如果我去print_r($headers);我得到這個

Array 
(
    [Content-Type] => application/x-www-form-urlencoded 
    [Content-Length] => 0 
    [Host] => localhost 
    [Referer] => 
    [SystemTime] => 2012-06-26+09%3a20%3a27 
) 

的$的var_dump頭

array(5) { 
    ["Content-Type"]=> 
    string(33) "application/x-www-form-urlencoded" 
    ["Content-Length"]=> 
    string(1) "0" 
    ["Host"]=> 
    string(9) "localhost" 
    ["Referer"]=> 
    string(0) "" 
    ["SystemTime"]=> 
    string(23) "2012-06-26+10%3a10%3a08" 
} 

的var_dump $鍵

array(5) { 
    [0]=> 
    string(12) "Content-Type" 
    [1]=> 
    string(14) "Content-Length" 
    [2]=> 
    string(4) "Host" 
    [3]=> 
    string(7) "Referer" 
    [4]=> 
    string(10) "SystemTime" 
} 

foreach ($headers as $name => $value) { 
    echo "$name: $value. From Array: {$headers[$name]}\n"; 
} 

返回:

Connection: Keep-Alive. From Array: Keep-Alive 
Content-Type: application/x-www-form-urlencoded. From Array: application/x-www-form-urlencoded 
Content-Length: 0. From Array: 0 
Host: localhost. From Array: localhost 
Referer: . From Array: 

Notice: Undefined index: SystemTime in /clientdata/apache-www/a/d/[XXXXXX].com/www/admin/request/GetPCLicence.php on line 22 
SystemTime: 2012-06-26+10%3a10%3a08. From Array: 

林卡住,我認真無法弄清楚是什麼出錯了。它應該工作。

PS。我知道SystemTime標題是非標準的。我從我的http_request中提供。

+0

您使用的是什麼PHP版本? – drew010

+2

使用'var_dump()'來查看字符串(鍵)是否是你期望的(例如空字節或unicode ws)。另外'SystemTime'不是標準標題。誰加了它?通過「任何標題」,你的意思是你嘗試了普通的? – mario

+0

PHP版本5.2.17 –

回答

2

我從你們那裏得到了很多幫助。我有一種感覺,因爲它在反序列化後工作,也許編碼是不同的,這就是爲什麼我們可以看到它,但沒有觸及它?下面

我的代碼得到所有的標題和轉換編碼,並把它在一個新的數組:)

這裏是我的「翻譯」的代碼。

$headersRaw = getallheaders(); 
    $headers = array(); 
    foreach($headersRaw as $key => $value) 
    { 
     $headers[mb_convert_encoding($key, "UTF-8")] = $value; 
    } 
+2

你是一個PHP查克諾里斯我想! – odiszapc

+1

*圓ElePHPant踢* Kapow! –

+0

聽起來似乎合理,但這並不能解釋「foreach」片段行爲:我們使用了由'foreach'提供的內容,但這不算作關鍵。 – raina77ow

0

此時最好的辦法可能是使用超全局$_SERVER得到你所需要的任何頭的值(例如$_SERVER['HTTP_SYSTEMTIME']

我不能用我的繁殖系統(PHP 5.4.3)的問題調用getallheaders()併發送一個自定義請求,就像你的SystemTime頭部設置爲2012-06-26+10%3a10%3a08一樣,它按預期工作,我看到打印出來的值是兩次(一旦使用了getallheaders()並且一次使用了$_SERVER這可能是一個奇怪的PHP錯誤,我沒有看到關於函數apache_request_headers的任何特別註釋,或者有關PHP的5.2.17分支中的代碼的任何奇怪的事情。

希望這有助於暫時。無論如何,使用$_SERVER['HTTP_*']可能會更可靠,因爲getallheaders在所有配置中都不可用。

+0

我已經試過了。我從頁面底部的http://php.net/manual/en/function.getallheaders.php獲得了一個函數,這個函數產生了相同的結果,這些結果是你指定的。 (我刪除了功能檢查,並使其'getAllHeadersEx()') –

+0

好,所以'$ _SERVER ['HTTP_SYSTEMTIME']'也沒有填充? – drew010

+0

它那裏,但無法訪問。 –