我正在使用Zend Framework 2的AbstractRestfulController
在我们的项目中实现CRUD API。使用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
$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环境中运行Ubuntu 14.04,PHP 5.4作为Apache 2.4模块。
可能是什么原因造成的?我阅读了HTML实体&
而不是普通&
的问题,但这似乎不适用于此。
更新
我只是通过SSH
进入Vagrant机器,在交互模式下在命令行上运行相同的代码。在交互模式parse_str
工作没有问题!然后,我从命令行通过$ php /var/www/test.php
运行我的测试脚本,该脚本也正常工作。
这是Apache PHP模块或配置的问题吗?
答案 0 :(得分:2)
请注意您的字符串在&
和a
上的拆分方式?
我认为配置设置arg_separator.input
被错误地设置为"&"
而不是默认"&"
。
可以在php.ini
,.htaccess
,httpd.conf
或.user.ini
中设置此设置。请参阅:Where a configuration setting may be set。
测试计划:
<?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);
使用php.ini
中的不同设置输出(稍微压缩):
arg_separator.input = '&'
array(2) {
["first"] => string(5) "value"
["arr"] => array(2) {
[0] => string(7) "foo bar"
[1] => string(3) "baz"
}
}
arg_separator.input = '&'
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) ""
}
配置设置arg_separator.output
也默认为"&"
。如果仅生成HTML输出,则将此设置为"&"
可能没问题。但是,如果要使用http_build_query()
生成HTTP Location:
标头,或者在HTML实体引用不适合的其他情况下,则会遇到麻烦。
测试计划:
<?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";
使用php.ini
中的不同设置输出:
arg_separator.output = '&'
a=0&b=1&c=2
arg_separator.output = '&'
a=0&b=1&c=2