Php apache_请求_头和数组_键_存在
这与其说是一个问题,不如说是一个警告,但也许有人能提供更好的解决方案 我正在从我的Android应用程序发送一个自定义请求头。 当请求到达PHP服务器时,我检查是否存在此头及其值。 为此,我使用Php apache_请求_头和数组_键_存在,php,android,http-headers,Php,Android,Http Headers,这与其说是一个问题,不如说是一个警告,但也许有人能提供更好的解决方案 我正在从我的Android应用程序发送一个自定义请求头。 当请求到达PHP服务器时,我检查是否存在此头及其值。 为此,我使用apache\u request\u headers()获取头数组,然后使用数组\u key\u exists()检查头 但是,array\u key\u存在('custom-header',$Hdr)将返回false! 所以我用print_r转储数组,瞧,数组中确实存在数组键。 以下是输出: Array
apache\u request\u headers()
获取头数组,然后使用数组\u key\u exists()检查头
但是,array\u key\u存在('custom-header',$Hdr)
将返回false!
所以我用print_r转储数组,瞧,数组中确实存在数组键。
以下是输出:
Array
(
[Accept-Encoding] => gzip
[Connection] => Keep-Alive
[Content-Type] => application/x-www-form-urlencoded
[Content-Length] => 103
[Host] => www.somedomain.com
[custom-header] => my-custom-header-value
)
我是怎么做到的
按如下方式克隆阵列:
// recuperate the request headers
$Hdr = apache_request_headers();
// clone the array as it will not correctly search with array_key_exists
$Keys = array_keys($Hdr);
$Values = array_values($Hdr);
$Headers = array();
for($i = 0; $i < count($Keys); $i++)
{
$Headers[$Keys[$i]] = $Values[$i];
}
//恢复请求头
$Hdr=apache_请求_头();
//克隆阵列,因为它将无法使用阵列\u键\u进行正确搜索
$Keys=阵列_键($Hdr);
$Values=数组_值($Hdr);
$Headers=array();
对于($i=0;$i
现在,当我使用array\u key\u查询新数组时('custom-header',$Headers)
,它返回true
这是一个已知的问题吗
有更好的解决办法吗
注意:为了保护我的代码,我更改了实际值的名称,这里给出了一个示例-请不要对这些值进行更正:-)
编辑:这发生在我的共享服务器上,在Apache 2.2.22版上运行PHP 5.3.10版,代码示例如下:
$Hdr = apache_request_headers();
$Keys = array_keys($Hdr);
$Values = array_values($Hdr);
$Headers = array();
for($i = 0; $i < count($Keys); $i++)
{
$Headers[$Keys[$i]] = $Values[$i];
}
var_dump($Hdr === $Headers); # true
或者稍微更改一下代码:
$Hdr = apache_request_headers();
$Headers = array();
foreach($Hdr as $Key => $Value)
{
$Headers[strtolower($Key)] = $Value;
}
给出你的示例数据
Array
(
[Accept-Encoding] => gzip
[Connection] => Keep-Alive
[Content-Type] => application/x-www-form-urlencoded
[Content-Length] => 104
[Host] => androidgmap.letrajet.com
[User-Agent] => LeTrajet Edition Cèdre
[letrajet-sig] => 32dbc2........
)
这包含两个可能的问题,小写标题名和“è”字符,它们可能在请求和/或比较代码中编码正确,也可能编码不正确。需要核实更多细节,但这:
key is missing : false
MyUserAgent == 'LeTrajet Edition Cèdre' : false
怀疑您的“è”字符存在字符集问题。您需要在进行比较的PHP代码中修复这一点。但是,此问题与数据有关,而与头键无关
您的代码中也包含以下内容:
else if($MyUserAgent == "LeTrajet Edition Cedre"
如果你的数据中有Cèdre,那怎么匹配呢
编辑:根据OP.的注释截断签名。Willisset($Hdr[“Custom header”])
返回true?您能在出现问题的地方提供代码吗?对于某些数组,它不起作用是没有意义的,但是当您将内容复制到相同的数组时,它就起作用了。至少,我希望看到一个具体的测试用例来显示这种行为。@Passerby-不,这也不行。@eis-具体的代码就是我描述的。我无法从我的Android应用程序中提供代码。我完全同意这是没有道理的。再次注意:当外部应用程序向PHP服务器发出请求时,会发生这种情况。因此,需要编写一个实际示例进行测试。如果你也是一名Android开发者,我相信你一定能够把这些整合起来。具体的代码,否则它就不会发生。如果没有一个可以复制的可验证的例子,这根本是不可信的。很难接受你关于PHP的股票数据结构“不工作”的解释。你到底从哪里得到的?这根本不是我发布的数据!这是数据用户rlemon在评论中发布的,作为对询问代码的回应。见问题注释。如果这不是正确的数据/源代码,请让我们现在提供正确的数据/源代码。我看到您决定从我的服务器获取我的代码,尽管我声明要保护我的代码。未经我的许可,请删除您在此处复制的数据@西蒙,如果你想保护你的代码,你可能不应该把它发布到互联网上,对吗?我可以在这里编辑它,但这并不意味着它对每个人都可用,也无助于解决问题。@Simon这不是代码,而是属于公共信息的头请求。更不用说你的url永远存储在上面,所以现在在修订版中。在提问之前,你应该先解析掉所有不需要的数据。
else if($MyUserAgent == "LeTrajet Edition Cedre"