我有以下
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标头的相关信息(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机箱上它可以工作,在ubuntu服务器上使用PHP版本5.2.4(使用Suhosin),但事实并非如此.它甚至可以在不同的服务器上运行,也可以使用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 >
post数组可能为空的原因有多种 – 很有可能它会回到人类/开发人员的错误.从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