【发布时间】:2014-11-15 14:46:17
【问题描述】:
我正在使用 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_dumping $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 实体 & 而不是普通的 & 的问题,但这似乎不适用于此处。
更新
我刚刚在命令行中通过SSHing 在 Vagrant 机器中以交互模式运行了相同的代码。在交互模式下parse_str 可以正常工作!然后我通过$ php /var/www/test.php 从命令行运行我的测试脚本,它也可以正常工作。
这是 Apache PHP 模块或配置的问题吗?
【问题讨论】:
-
刚刚用 PHP v5.4 试了一下,没有任何问题。也许您的字符串包含使 PHP 窒息的不可见字符?你可以试试
echo strlen($content)看看你得到了什么? -
复制了你发布的那个。 codepad.viper-7.com/FYbCCx 看起来不错
-
strlen($content) 给了我 35 的长度,这是正确的,可能是我的 PHP 版本的问题还是类似的问题?
-
我现在在命令行的交互模式下尝试了与上面相同的代码,我已将我的发现添加到最初的问题中