PHP5.4“;解析“u str”;出人意料的行为
我正在使用Zend Framework 2的PHP5.4“;解析“u str”;出人意料的行为,php,php-5.4,Php,Php 5.4,我正在使用Zend Framework 2的AbstractRestfulController在我们的项目中实现CRUDAPI。使用PUT-HTTP方法调用更新现有实体的逻辑 当接收PUT请求时,AbstractRestfulController使用PHP的parse_str函数将请求主体转换为数组,但该函数不执行它应该执行的操作 因为它给了我奇怪的结果,所以我尝试使用PHP文档中提供的示例数据进行parse_str: // sample data from the PHP docs $cont
AbstractRestfulController
在我们的项目中实现CRUDAPI。使用PUT-HTTP方法调用更新现有实体的逻辑
当接收PUT请求时,AbstractRestfulController
使用PHP的parse_str
函数将请求主体转换为数组,但该函数不执行它应该执行的操作
因为它给了我奇怪的结果,所以我尝试使用PHP文档中提供的示例数据进行parse_str
:
// sample data from the PHP docs
$content = "first=value&arr[]=foo+bar&arr[]=baz";
// put the parsed variables into $parsedParams
parse_str($content, $parsedParams);
var_dump
ing$parsedParams
提供了以下信息
array(5) {
["first"]=> string(1) "v"
["lue"]=> string(0) ""
["rr"]=> array(2) {
[0]=> string(5) "foo b"
[1]=> string(1) "b"
}
["r"]=> string(0) ""
["z"]=> string(0) ""
}
显然,字符“a”混淆了parse_str
,但我完全不知道是什么导致了这种奇怪的行为。PHP文件的编码是UTF-8,服务器在Vagrant环境中运行Ubuntu14.04和PHP5.4,作为Apache2.4模块
这可能是什么原因?我阅读了有关HTML实体的问题&
而不是普通的&
,但这似乎不适用于这里
更新
我只是通过SSH
ing以交互模式在命令行上运行了相同的代码,并将其插入到流浪者机器中。在交互模式下,parse_str
工作正常!然后,我通过$php/var/www/test.php
从命令行运行测试脚本,该脚本也正常工作。
这是Apache PHP模块或配置的问题吗?注意字符串在
&
和a
上是如何分割的
我认为配置设置被错误地设置为“&;”
,而不是默认的“&
可以在php.ini
、.htaccess
、httpd.conf
或.user.ini
中设置此设置。请参阅:
测试程序:
<?php
echo "arg_separator.input = '", ini_get ('arg_separator.input'), "'\n";
$content = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($content, $parsedParams);
var_dump ($parsedParams);
arg_separator.input = '&'
array(2) {
["first"] => string(5) "value"
["arr"] => array(2) {
[0] => string(7) "foo bar"
[1] => string(3) "baz"
}
}
<?php
echo "arg_separator.output = '", ini_get ('arg_separator.output'), "'\n";
$q = http_build_query (array ('a' => 0, 'b' => 1, 'c' => 2));
echo $q, "\n";
arg_separator.output = '&'
a=0&b=1&c=2
配置设置也默认为
“&”
。如果您只生成HTML输出,那么将其设置为“&;”
就可以了。但是,如果您想使用生成HTTPLocation:
头,或者在HTML实体引用不合适的其他情况下,您将遇到麻烦
测试程序:
<?php
echo "arg_separator.input = '", ini_get ('arg_separator.input'), "'\n";
$content = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($content, $parsedParams);
var_dump ($parsedParams);
arg_separator.input = '&'
array(2) {
["first"] => string(5) "value"
["arr"] => array(2) {
[0] => string(7) "foo bar"
[1] => string(3) "baz"
}
}
<?php
echo "arg_separator.output = '", ini_get ('arg_separator.output'), "'\n";
$q = http_build_query (array ('a' => 0, 'b' => 1, 'c' => 2));
echo $q, "\n";
arg_separator.output = '&'
a=0&b=1&c=2
刚刚在PHPV5.4中试用过,它可以正常工作。也许您的字符串包含使PHP窒息的不可见字符?你能试试echo strlen($content)看看你得到了什么吗?复制一下你贴的。似乎finestrlen($content)给了我35的长度,这是正确的,可能是我的PHP版本有问题还是类似的问题?我现在在命令行的交互模式下尝试了与上面相同的代码,我已将我的发现添加到初始问题中。非常感谢,这是问题的根源!我花了好几年的时间才弄明白。在设置Vagrant环境时,我将php.ini从生产服务器(共享环境)复制到Vagrant机器,我想我也必须在生产服务器上注意这个问题。我可以安全地将arg_separator.output保留为“&;”吗?