PHP格式POST中的复选框是否有限制


Is there a limit on checked checkboxes in PHP form POST?

我遇到了一个问题,我似乎无法解决。我有一个表单(method="post" enctype="multipart/form-data"),用户可以在其中选择一些选项。他们有可能"全部检查"。如果他们"全部检查",他们正在检查2000+盒。为了检查我的表单是否真的被发布,我有以下(不太复杂)代码:

<?php
if(isset($_POST['bijwerken'])) {
echo "YIPPEE!!";
}
?>

现在,如果我选中所有框,我没有得到任何反馈。如果我只选择 20 个框,我确实会得到反馈。我错过了什么?复选框也由脚本生成,带有回显:

echo "&nbsp;&nbsp;<input type='"checkbox'" name='"productsoorten[]'" value='" . $rowproductsoorten1[productsoort1] . "'>&nbsp;  " . $rowproductsoorten1[productsoort1] . "<br />"; 

希望听到一些好主意!

是的,实际上有一个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 
我相信

大多数人会选择简单而不是更好的设计,我不会解释我如何处理这个问题的每一个细节。如果您不明白我在说什么,或者不想付出额外的努力来编写此伪代码,那么此解决方案可能不适合您。

我会在你开机自检之前压缩这些数据。首先从表单标签中取出复选框,这样它们就不会被发布(我们将提供自己的数据)。

其次,当用户提交表单(现在只有一个按钮)时,运行一些JS,它遍历你的DOM并收集所有的检查数据。它将需要创建一个长数组,然后如果仅选中该复选框,则需要使用单独的长整型来移动活动位(从 1 开始,将每个复选框的值加倍,直到达到>2147483647)。我会在每组 31 位时停止(即使 JS 使用 64 位长型;移位操作在 32 以上不起作用;此外,JS 没有无符号变量,所以除非你想处理翻转 - 符号,而所有这些正在进行,那么这也已经结束了)。

第三,将其发布到隐藏文本字段中的服务器,在服务器端,您可以逆转所有这些。

第四,在服务器上解码。

第五:如果您需要正确开始正确设置检查,请反向执行所有操作。

这样做的优点: - 客户端和服务器之间的数据传输量大大减少 - 无需修改 php.ini 甚至 .htaccess - 这能够动态增长和收缩(如果您再添加 2000 次检查,则无需重新配置任何内容) - 某些浏览器对您可以发布的字节''字段数有限制,因此简单地增加字段数量并不总是有帮助。 - IE对URL的长度有限制,所以忘记其他解决方案的GET吧。也许,你可以用这个来做到这一点。

弊: - 实现起来要困难得多(对于客户端和服务器,几乎所有事情都需要完成 2 次) - 用户可能没有启用 JS - JS在位移位方面需要很多帮助 - 使用更多的 CPU 时间

--

如果你想把它提升一个档次,那么你需要解决JS位移运算符问题(这将使你的数据长度几乎减半): 将javascript整数转换为字节数组并返回

这个改进的版本还需要在服务器上安装64位PHP(或BigInt类,这超出了这个问题的范围)。