当表单包含大量输入时,表单数据被截断/丢失?

Posted

技术标签:

【中文标题】当表单包含大量输入时,表单数据被截断/丢失?【英文标题】:Truncated/missing form data when form contains large number of inputs? 【发布时间】:2013-11-12 20:58:01 【问题描述】:

背景 我正在使用在 nginx 上运行的 CodeIgniter 2.1.4 和 php 5.3。我有一个 html 表单,它表示本质上是同质数据的行。每个“行”都有几个 <input /> 字段,每个字段都具有相同的名称。这是一个简化的示例:

<input type="text" name="firstname[]" />
<input type="text" name="lastname[]" />

所以,我有很多 firstname[] 输入、lastname[] 输入等。提交表单后(操作是 POST),我在控制器方法中检索数据,如下所示(请注意,我m 使用 CodeIgniter):

$firstnames = $this->input->post('firstnames');
$lastnames = $this->input->post('lastnames');

这些变量是包含表单中相应行的值的数组,从这里我对这些数据进行一些处理。

问题 当表单中的行数很大(几百行)时,生成的 PHP 数组的大小与表单中的输入数量不匹配——例如,表单可能有 200 @ 987654327@ 输入,但 $firstname 数组只有 167。此外,$lastname 变量的大小也不同——166。

当表单的元素数量较少时,一切正常。

我的理论是我超出了堆栈中某处的某种最大大小设置或缓冲区,导致表单数据被截断。是否有我不知道的“最大表单大小”的 PHP 或 CodeIgniter 或 nginx 设置?

对于它的价值,我在使用 application/x-www-form-urlencodedmultipart/form-data 作为表单的内容类型时看到了相同的行为。

我错过了什么?

【问题讨论】:

您很可能安装了 suhosin php 安全补丁。它限制了允许的输入参数的数量。 【参考方案1】:

假设没有 suhosin... 那么请参阅:max_input_vars 和 max_input_nesting_level。

当人们想到 PHP 中的 POST 限制时,这些是较新的并且经常被忽视。

但如果它像你说的那样被截断,那么它可能只是你的post_max_size。

另外,这只是一个愚蠢的问题......

PHP max_input_vars Increasing the maximum post size 等等。

【讨论】:

问题是max_input_vars。它设置为 1000,我的表单中的每一“行”都有 6 个输入。 1000 / 6 = 166.6;所以每当我有超过 167 个“行”时,我都会遇到这个问题(我的一些数组包含 166 个项目,而其他数组包含 167 个)。感谢您的帮助! 我的被评论了。我只是取消注释并设置为 10000。到目前为止一切顺利。如果这是一个错误,请有人评论。

以上是关于当表单包含大量输入时,表单数据被截断/丢失?的主要内容,如果未能解决你的问题,请参考以下文章

添加到 HTML 表单而不会丢失 Javascript 中的当前表单输入信息

当 innerHTML 时,表单值在上一页丢失

当表单滚动到屏幕外时,每个表单字段的状态会丢失吗?

在需要“选择”或“输入”时验证表单

使用 Javascript 检测已取消的表单帖子

HTML 文件在打印或导出时丢失输入值