PHP奇怪的未定义索引错误

10

我遇到了一个非常令人沮丧的问题,无法检索任何标题。这是我的代码:

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

这两行都会产生错误,即“Undefined index: 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
)

$headers的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"
}

$keys变量的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: 

我被卡住了,我真的想不出哪里出了错。它应该可以工作。

附注:我知道SystemTime头部是非标准的。我从我的http请求中提供它。


2
使用 var_dump() 查看字符串(键)是否符合预期(例如,空字节或Unicode ws)。此外,“SystemTime”不是标准标题。谁添加了它?“任何标题”是否意味着您尝试了普通的标题? - mario
2
我很好奇看看 $headers = getallheaders(); foreach ($headers as $name => $value) { echo "$name: $value. From Array: {$headers[$name]}\n"; } 的结果是什么。 - drew010
AHA!我在付费的网络服务器上尝试了一下(与我的本地主机相比),结果它运行正常。 - Craig White
该代码产生了以下错误: Catchable fatal error: Object of class stdClass could not be converted to string - Craig White
是的,我可以!在序列化和反序列化后,数据的访问起作用了!但为什么? - Craig White
显示剩余14条评论
2个回答

3

在得到大家的帮助后,我终于明白了。我有一种感觉,因为反序列化后它能工作,也许编码不同,这就是为什么我们可以看到它但不能操作它的原因?

我的代码如下,获取所有标题并转换编码,将其放入新数组中 :)

这是我的“翻译”代码。

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

2
你是PHP界的Chuck Norris吧! - odiszapc
1
圆形ElePHPant踢* Kapow! - Craig White
我认为这里使用的机制与unserialize/serialize相同。 - raina77ow
可能是因为使用[index]时更改了编码,所以我们无法通过与foreach刚刚检索到的相同值访问。 - Craig White
我可以给我的女儿取名叫Craig吗? - odiszapc
显示剩余2条评论

0

目前你最好的选择可能是使用$_SERVER超全局变量获取任何需要的头信息(例如$_SERVER['HTTP_SYSTEMTIME'])。

我在我的系统上(PHP 5.4.3)通过调用getallheaders()并像你一样发送一个自定义请求,其中SystemTime头设置为2012-06-26+10%3a10%3a08,无法重现这个问题。它按预期工作,并且我看到值打印了两次(一次使用getallheaders(),一次使用$_SERVER)。这很可能是一个奇怪的PHP bug,因为我没有看到有关函数apache_request_headers的任何特殊说明,或者在PHP 5.2.17分支中有任何奇怪的代码。

希望这暂时能帮到你。使用$_SERVER['HTTP_*']可能更可靠,因为getallheaders在所有配置中都不可用。


我已经尝试过这个了。我从http://php.net/manual/en/function.getallheaders.php的页面底部获取了一个函数,它产生了相同的结果,可以实现你所需的功能。(我去掉了函数检查并将其命名为`getAllHeadersEx()`) - Craig White
好的,所以$_SERVER['HTTP_SYSTEMTIME']也没有填充吗? - drew010
它在那里,但无法访问。 - Craig White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接