2012-06-26 51 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

它那里,但无法访问。 –