我有以下 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,然后看看会发生什么。