我遇到了一个问题,我似乎无法修复。我有一个表单(method =“post”enctype =“multipart / form-data”),用户可以在其中选择一些选项。他们 有可能'全部检查'。如果他们“全部检查”,他们正在检查 2000+盒子。要检查我的表单是否实际发布,我有以下(不是那么复杂)代码:
<?php
if(isset($_POST['bijwerken'])) {
echo "YIPPEE!!";
}
?>
现在,如果我检查所有方框,我都没有得到任何反馈。如果我只选择20个盒子,我确实得到了反馈。我错过了什么?复选框也由脚本生成,带有echo:
echo " <input type=\"checkbox\" name=\"productsoorten[]\" value='" . $rowproductsoorten1[productsoort1] . "'> " . $rowproductsoorten1[productsoort1] . "<br />";
会喜欢听到一些好主意!
答案 0 :(得分:10)
是的,实际上有一个max_input_vars
设置。默认值为1000,如果输入字段的数量超过该值,则您的帖子输入将不起作用。
编辑您的php.ini
文件(如果您使用的是Unix系统,通常位于/etc/php5/apache2/php.ini
)并增加限制:
max_input_vars = 5000
如果您无法修改php.ini
文件,可以将其添加到.htaccess
:
php_value max_input_vars 5000
答案 1 :(得分:2)
我敢肯定大多数人会选择简单而不是更好的设计,我不打算解释我如何处理这个问题的每一个细节。如果你不明白我在说什么或者不想花费额外的努力来编写这个伪代码,那么这个解决方案可能不适合你。
我会在POST之前压缩这些数据。首先从表单标签中取出复选框,以便它们不会被发布(我们将自己发布数据)。
其次,当用户提交表单时(现在只需一个按钮)运行一些JS,它遍历你的DOM并收集你所有的检查数据。它将需要创建一个长数组,然后如果仅选中该复选框,则需要使用单独的long来移动有效位(从1开始并将每个复选框的值加倍,直到达到&gt; 2147483647)。我会停在每组31位(即使JS使用64位长;移位操作不能超过32;同样,JS没有无符号变量,所以除非你想处理翻转 - 符号,而所有这些都是接下来就是这样。)
第三,将它发布到隐藏文本字段和服务器端的服务器上,你可以反转所有这些。
第四,在服务器上对此进行解码。
第五:如果您需要检查以开始正确设置,请再次执行此操作。
这样做的好处: - 客户端和服务器之间传输的数据更少 - 无需修改php.ini甚至.htaccess - 这可以动态增长和缩小(如果添加另外2000个检查,则无需重新配置任何内容) - 某些浏览器对可以发布的字节数或字段数有限制,因此简单地增加字段数并不总是有用。 - IE对URL的长度有限制,所以忘记使用其他解决方案进行GET。可能,你可以用这个来做。
缺点: - 实施起来要困难得多(对于客户端和服务器来说,几乎所有东西都需要完成2次) - 用户可能没有启用JS - JS在位移方面需要很多帮助 - 使用更多的CPU时间
-
如果你想提高一个档次,那么你需要解决JS位移操作符问题(这几乎会使你的数据长度减半):Converting javascript Integer to Byte array and back
这个改进的版本还需要在服务器上安装64位PHP(或者BigInt类,这个问题超出了这个问题的范围)。