我有以下的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”(button)的条目“action”。 但是,无论我在田间input什么样的价值, 结果总是:
array(2) { ["test"]=> string(0) "" ["action"]=> string(2) "Go" } string(16) "test=&action=Go&"
不知何故,名为test的数组被清空,“动作”variables确实通过了。
我已经使用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的Ubuntu服务器上(使用Suhosin),它不能。 它甚至可以在不同的服务器上运行,也可以在安装了Suhosin的Ubuntu和相同的PHP版本上运行。
我diff php.ini phps.ini这两个文件,这是输出( 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是从它的工作服务器和php.ini是目前的一个。 看起来好像这里没有问题吧?
有一些可能的原因,为什么后数组可能是空的 – 有可能回到人类/开发人员的错误。 从PHP 5.2升级到5.4时,我遇到了这个问题,这很简单,但需要几个小时的时间才能find问题。 在我们的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()打开,我build议你这样做,我相信你将能够解决这个问题。
您还应该检查已弃用的系统function,如“ magic_quotes ”,因为使用它们只是无法返回结果。 我希望这有帮助。 祝你好运。 JCS 🙂
它没有明确的指标工作吗? 尝试:
<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>
在PHP的错误跟踪器中有关于这个或类似问题的错误报告:
不幸的是,它没有提到一个解决scheme,但你可以尝试设置另一个CONTENT_TYPE或根本没有内容types。
有一个相当类似的问题。 那么,首先,我花了相当长的时间才能到达这个职位。 要找出我的问题的名称,我不得不安装PHP控制台,找出如何使用它。 debugging我一无所知的代码。 find问题的根源,仍然困惑。
实际上这个解决scheme非常简单。 在Chrome中,按F12转到开发者工具,selectnetworking,尝试发布您的表单。 跟踪post请求,看看状态。 如果它的301(或其他200以外的任何东西) – 你有同样的确切问题,直到最近我一直在!
我的新主机提供商将http://my_site.comredirect到http://www.my_site.com ,我所要做的就是将一些设置作为我的CMS的一部分(您的可能会不同但类似)
$Configuration['BASE_URL'] = 'http://my_site.com'
至
$Configuration['BASE_URL'] = 'http://www.my_site.com'
瞧,魔术和彩虹,独angular兽和我的网站终于工作了!
PS梅辛你的主机设置也可以解决你的问题…如果你的问题是类似于我的,当然…
我不确定,但有
name="test[1]"
等可能会混淆php。 我会改变input名称test_1,test_2,看看会发生什么。
在基本的PHP中,我只能想到一个configuration选项,可以打破这个,这是post_max_size ,所以检查你的php.ini和相关文件,以确保这个值是理智的,而不是设置为零或一个无效的值,如字母字符。
Suhosin可以在各种条件下阻止postvariables,包括数组长度和variables名称长度等。 grep你的php.ini文件中的“suhosin”,看看是否有任何设置,尤其是任何以“suhosin.post”开头的设置。 (请参阅http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depth ,了解有关我所考虑参数的更多详细信息。)
不幸的是,除非configuration中的一些重大错误使得某些值设置为1或0,否则您的代码(和variables)足够短,这是远远不够的。 如果出现空白,我的下一个build议是备份你的Apache和PHPconfiguration文件,清除它们的目录,清除软件包,重新安装,并开始放置configuration块,直到代码再次停止工作(或者,开始更新服务器这是从无function的服务器configuration,直到他们都被打破)。 既然你有相同的操作系统相同的PHP服务器正常工作,这几乎肯定是在某个地方发生故障的服务器上的configuration错误,但这是一个相当大的干草堆search。
在开始之前,强烈build议使用/ etc的版本控制 – 查看etckeeper软件包。 (实际上,我build议它的使用期限,尤其是在一个机器上有一个以上的用户可以访问root)。
自从我从“stable”升级到Debian“testing”以来,我的表单提交失败了。 看来,apache2或php5不提交具有相同名称的提交中的多个项目。 例如; 你的表单有两个input名字“mo”。 在过去,只有一个“莫”的价值将通过。 现在,表单似乎在第一次出现重复键后丢弃所有数据。 尚未确定。 仍然试图弄清楚。
尝试从服务器上的php.ini复制到这个服务器(尽pipe先备份非工作服务器的php.ini)。 如果是的话,它是在那里的东西(也许是variables_order,或可能是内存,虽然不大可能)。
尝试将您的提交button重命名为除动作之外的其他内容。 过去我曾遇到过一些问题。 有一个名为“行动”的input似乎是问题。
以下不应该帮助你。 它反对我所知道的PHPconfiguration的一切:
< variables_order = "EGCSP" --- > variables_order = "EGPCS"
这一个跳上了我。 你的superglobals正在以不同的顺序登记。 这不应该是一个问题,因为既然你没有使用register_globals并且不依赖于它们,改变顺序variables的处理顺序应该不成问题。
但是你应该明确地尝试一下,改变variables的顺序。
即使那OP是相当古老的,但今天我遇到了类似的问题。
花了几个小时反复检查了几百万个不同的东西后,最终发现,在PHP的默认设置中,我们的cPanel中的PHP 5.6.17版本的最后一次更新没有被选中。
并将其设置为选定 – 一切恢复正常:-)
希望这将有助于未来的读者