5

我遇到了一个问题,我似乎无法解决。我有一个表单(method="post" enctype="multipart/form-data"),用户可以在其中选择一些选项。他们有可能“检查所有”。如果他们“检查所有”,他们检查了大约 2000 多个框。要检查我的表单是否真的被发布,我有以下(不是那么复杂)代码:

<?php

if(isset($_POST['bijwerken'])) {

echo "YIPPEE!!";

}

?>

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

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

很想听到一些好主意!

4

2 回答 2

11

是的,实际上有一个max_input_vars设置。默认值为 1000,如果输入字段的数量超过此数量,您的帖子输入将不起作用。

编辑您的php.ini文件(/etc/php5/apache2/php.ini如果您在 Unix 系统上,通常是在)并增加限制:

max_input_vars = 5000

如果无法修改php.ini文件,可以将其添加到.htaccess

php_value max_input_vars 5000 
于 2013-09-06T20:31:18.000 回答
2

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

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

其次,当用户提交表单(现在只有一个按钮)时,运行一些 JS 来遍历您的 DOM 并收集您的所有检查数据。它将需要创建一个 long 数组,然后如果仅选中复选框,则需要使用单独的 long 来移动活动位(从 1 开始并将每个复选框的值加倍,直到达到 >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 类,这超出了这个问题的范围)。

于 2013-09-06T21:42:53.173 回答