PHP5.4" parse_str"表现出乎意料

时间:2014-11-15 14:46:18

标签: php php-5.4

我正在使用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模块或配置的问题吗?

1 个答案:

答案 0 :(得分:2)

请注意您的字符串在&a上的拆分方式?

我认为配置设置arg_separator.input被错误地设置为"&"而不是默认"&"

可以在php.ini.htaccesshttpd.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 = '&amp;'
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输出,则将此设置为"&amp;" 可能没问题。但是,如果要使用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 = '&amp;'
a=0&amp;b=1&amp;c=2