PHP中的$_POST数组变量被截断

6
我正在使用带有Apache 2.0的PHP 5.3.8。 我还在使用Symfony 2,但脚本失败的地方不是那里。 我有一个包含数组变量的表单:
<form action="/app_dev.php/admin/position/create" method="post">
  <input type="text" id="po_name" name="po[name]" required="required" maxlength="50">
  <input type="text" id="po_role" name="po[role]" required="required" maxlength="20">
</form>

在app_dev.php文件中(排除Symfony的问题),我直接执行以下操作:
echo file_get_contents("php://input"); // outputs: po%5Bname%5D=Developer&po%5Brole%5D=ROLE_USER
var_dump($_POST); // outputs: array(1) { ["po"]=> array(1) { ["name"]=> string(9) "Developer" } }
die();

基本上它只保留数组中的第一个变量。如果我将变量名称从po [role]更改为ba [role],那么$ _POST输出:
array(1) {
  ["po"]=> array(1) { ["name"]=> string(9) "Developer" },
  ["ba"]=> array(1) { ["role"]=> string(9) "ROLE_USER" }
}

我发现导致此问题的典型问题是由于以下php.ini配置,我还提供了我的值:

max_execution_time = 30
max_input_time = 60 
max_input_nesting_level = 64
max_input_vars = 1000
post_max_size = 8M
upload_max_filesize = 2M
memory_limit = 128M

这些值似乎合理,我认为不会引起问题,但不能百分之百确定。
我没有安装suhosin,因为我读到它也可能导致类似的问题。
这也类似于this problem,但给出的解决方案需要我重写HttpFoundation Symfony组件。
此外,我不想在没有数组的情况下重新编写表单变量(例如po[name]到po_name),因为Symfony自动生成表单,而这似乎是PHP应该能够处理的基本功能。
有人对这个问题有什么想法吗?
PS:这与here中描述的问题类似。此外,该问题发生在相同版本的Suse上(SUSE Linux Enterprise Server 11)。

2
我从未见过这样的东西.. po[name] 和 po[role] - Mr. Alien
2
@Mr.Alien 那你可能还没见过很多。它完全可以正常工作。通常情况下是这样的。 - deceze
2
@deceze 很有趣... 它返回数组(1) { ["po"]=> array(1) { ["name"]=> string(9) "Developer" } } - Sylvain
1
你是否曾在其他服务器上测试过它?只是为了确保这不是由于您本地机器的配置引起的问题... - Mahdi
1
@Sylvain 我建议你不要再花时间去调试了,直接在你的服务器上进行全新的基础安装(如果可能的话),然后开始安装/启用其他模块或组件,以查看哪个导致了这样奇怪的问题。 - Mahdi
显示剩余16条评论
2个回答

1

你提出的方案对我来说很好。完整的测试代码:

<html>
<body>
<pre>
<?php
if (isset($_POST) && !empty($_POST))
{
        echo file_get_contents("php://input");
        echo "\n\n";
        var_dump($_POST);
}
?>
</pre>
<form action="" method="post">
  <input type="text" id="po_name" name="po[name]">
  <input type="text" id="po_role" name="po[role]">
  <input type="submit">
</form>
</html>

带有“one”和“two”值的结果片段:

po%5Bname%5D=one&po%5Brole%5D=two

array(1) {
  ["po"]=>
  array(2) {
    ["name"]=>
    string(3) "one"
    ["role"]=>
    string(3) "two"
  }
}

我的PHP:

PHP Version 5.3.3-7+squeeze14
CGI/FastCGI
Apache/2.2
Suhosin Patch 0.9.9.1

这里没有问题,所以它应该可以正常工作。如果这个测试代码对你不起作用,我最好的猜测是你所使用的PHP版本存在一个bug(或者是一些看似无关的功能存在bug,但在任何地方都没有提到)。


1
我们最终决定将PHP版本更新到更高的版本(5.3.15),现在它可以正常工作了。所以这肯定是与5.3.8有关的问题,至少是我们使用的版本有问题。

2
是的,就像我说的那样,“你所使用的版本中有一个PHP错误” :) - eis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接