【问题标题】:PHP Weird Undefined index errorPHP奇怪的未定义索引错误
【发布时间】:2012-06-26 00:02:31
【问题描述】:

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

$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
)

$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_request 中提供。

【问题讨论】:

  • 你使用的是什么 PHP 版本?
  • 使用var_dump() 查看字符串(键)是否符合您的预期(例如空字节或unicode ws)。 SystemTime 也不是标准标题。谁加的? “任何标题”是指您尝试了普通标题吗?
  • 我的客户端是 C#。我知道它 100% 有效。我上面贴的代码实际上是我代码的前几行。
  • 我很想知道$headers = getallheaders(); foreach ($headers as $name => $value) { echo "$name: $value. From Array: {$headers[$name]}\n"; } 的结果。
  • 您的 foreach 结果已发布在上方

标签: php arrays http-headers


【解决方案1】:

在你们的大力帮助下,我得到了它。我有一种感觉,因为它在反序列化之后起作用,可能编码不同,这就是为什么我们可以看到它,但不能触摸它?

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

这是我的“翻译”代码。

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

【讨论】:

  • 我认为你是 PH​​P Chuck Norris!
  • 圆象腿踢 Kapow!
  • 听起来有道理,但这并不能解释 foreach sn-p 的行为:我们使用了 foreach 提供的东西,但这不算作密钥。
  • 我宁愿在这里假设我们有与反序列化/序列化相同的机制。
  • 可能是在使用 [index] 时它会更改编码,这就是为什么我们无法通过我们刚刚通过 foreach 检索到的相同值进行访问。
【解决方案2】:

此时您最好的选择可能是使用$_SERVER 超全局获取您需要的任何标头的值(例如$_SERVER['HTTP_SYSTEMTIME']

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

希望这暂时有所帮助。无论如何,使用$_SERVER['HTTP_*'] 可能更可靠,因为getallheaders 并非在所有配置中都可用。

【讨论】:

  • 我已经试过了。我从页面底部的php.net/manual/en/function.getallheaders.php 获得了一个函数,它产生了相同的结果,这就是你指定的。 (我删除了功能检查并使其成为getAllHeadersEx()
  • 好的,$_SERVER['HTTP_SYSTEMTIME'] 也没有填充?
  • 它在那里但无法访问。
猜你喜欢
  • 2023-03-18
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2016-08-17
  • 2012-05-23
  • 1970-01-01
  • 2018-03-05
相关资源
最近更新 更多