PHP最大表单提交input条数限制max_input_vars,导致post提交保存部分数据

PHP最大表单提交input条数限制max_input_vars导致post提交保存部分数据

遇到问题

后台编辑数据时,post提交数据,发现只有前面的部分字段保存成功,后面的字段并未保存成功。

问题分析

默认情况下,post提交的数据大小限制“post_max_size”在php.ini中默认设置为8M,经确认,提交的数据并未超过8M,可排除非数据大小导致;

php -i | grep ‘post_max_size’
在这里插入图片描述

经排查发现,post提交的表单最大数量限制“max_input_vars”在php.ini中默认设置为1000,经确认,提交的表单数量确实超过了1000,表单数量超过1000,便会截取超出数据,这就是保存时只有部分保存成功,部分保存失败的原因,问题定位成功。

查看表单数量的方法:

network中找到post请求的链接记录,在Headers请求中可看到FormData数据,折叠FormData即可看到post请求时提交的表单数量【见图一】,展开FormData可看到具体请求的表单数据【见图二】,可发现导致表单超限的是机构“company_organize_ids”字段,需要注意的是,company_organize_ids是以数组的形式传递的,虽然后台使用$_POST接收时是一个数组,但是在web端计算提交的表单数量时,是按照多个计算的,所以表单会超限。

解决方案

方法1、直接修改php.ini中表单提交数量最大限制的配置项 “max_input_vars”为大一些的值,这样便不会受1000的限制了。

在这里插入图片描述
方法2、事实上,通过方法一的改大限制的方式是治标不治本的,而且代码中一次性传递1000个表单数量,会影响执行效率,比较好的解决方案是提交数据时,不要有大量表单的提交,即将大量的表单数据处理整合为一个json或者序列化数据,作为一个表单元素。

killall php-fpm && php-fpm

反思:事实上,通过这种改大限制的方式也是治标不治本,最好还是从源头上改变,提交数据时,将数据整合好,不要有大量表单的提交。

猜你喜欢

转载自blog.csdn.net/guo_qiangqiang/article/details/112994458