神秘的空 $_POST 数组

神秘的空 $_POST 数组

我有以下 HTML/PHP 页面:

<?php
if(empty($_SERVER['CONTENT_TYPE'])) {
    $type = "application/x-www-form-urlencoded";
    $_SERVER['CONTENT_TYPE'] = $type;
}

echo "<pre>";
var_dump($_POST);
var_dump(file_get_contents("php://input"));
echo "</pre>";
?>

<form method="post" action="test.php">
<input type="text" name="test[1]" />
<input type="text" name="test[2]" />
<input type="text" name="test[3]" />
<input type="submit" name="action" value="Go" />
</form>

如您所见,表单将提交,预期输出是一个 POST 数组,其中包含一个包含填写值的数组和一个值为“Go”(按钮)的条目“action”。但是,无论我在字段中输入什么值;结果始终是:

array(2) {
  ["test"]=>
  string(0) ""
  ["action"]=>
  string(2) "Go"
}
string(16) "test=&action=Go&"

不知何故,名为 test 的数组被清空,“action”变量却成功通过。

我使用了 Firefox 的 Live HTTP Headers 扩展来检查 POST 字段是否已提交,结果确实如此。来自 Live HTTP Headers 的相关信息(文本框中填写了 a、b 和 c 作为值):

Content-Type: application/x-www-form-urlencoded
Content-Length: 51
test%5B1%5D=a&test%5B2%5D=b&test%5B3%5D=c&action=Go

有人知道为什么会发生这种情况吗?我对此感到很担心,它已经浪费了我太多时间……

更新:

我们在不同的服务器上尝试过,在 Windows 机器上可以运行,但在安装了 PHP 版本 5.2.4(带有 Suhosin)的 Ubuntu 服务器上却不行。它甚至在另一台安装了 Ubuntu 和相同 PHP 版本(也安装了 Suhosin)的服务器上也能运行。

我已经对这两个文件进行了差异处理,这是输出(diff php.ini phps.ini):

270c270
< memory_limit = 32M
---
> memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)
415c415
< variables_order = "EGCSP"
---
> variables_order = "EGPCS"
491d490
< include_path = ".:"
1253a1253,1254
> extension=mcrypt.so
>

其中 phps.ini 是其所在服务器的 phps.ini,而 php.ini 是当前的 phps.ini。看起来这里没什么问题,对吧?

答案1

有许多可能的原因导致帖子数组为空 - 很有可能是人为/开发人员的错误。我从 PHP 5.2 升级到 5.4 时遇到了同样的问题,这个问题很简单,但花了几个小时进行故障排除才找到错误。在我们的 config.php 文件中,我们有以下语句来处理 $_POST 数组:

if (!get_magic_quotes_gpc()) {
    if (isset($_POST)) {
        foreach ($_POST as $key => $value) {
            $_POST[$key] =  trim(addslashes($value));
        }
    }

魔术引号曾经启用过,并且在 PHP 5.2 之前的版本中,上述功能可以正常工作,但在 5.2 以上的任何版本中,它都无法处理并返回一个空数组。

如果您还没有error_reporting()打开,我建议您打开,我相信您一定能够解决问题。

您还应该检查已弃用的系统功能,例如“ magic_quotes”,因为使用它们根本无法返回结果。希望这能有所帮助。祝你好运。JCS :)

答案2

它有用吗?没有明确的指标?尝试:

<form method="post" action="test.php">
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="submit" name="action" value="Go" />
</form>

答案3

PHP 的错误跟踪器中有关于此问题或类似问题的错误报告:

不幸的是,它没有提到解决方案,但您可以尝试设置另一个 CONTENT_TYPE 或根本不设置内容类型。

答案4

我不确定,但

name="test[1]"

等可能会使 php 混淆。我将输入名称更改为 test_1、test_2,然后看看会发生什么。

相关内容