一、遇到的问题
编辑机构数据时,post提交数据,发现只有前面的部分字段保存成功,后面的字段并未保存成功。
二、解决
默认情况下,post提交的数据大小限制“post_max_size”在php.ini中默认设置为8M,经确认,提交的数据并未超过8M,可排除非数据大小导致;
经排查发现,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或者序列化数据,作为一个表单元素。
图一
图二
四、延伸
1、此问题为线上环境的问题,在本地环境并未复现,经排查本地为php5.3.5, "max_input_vars"支持php5.3.9及以上版本,php5.3.5并无此配置项,即php5.3.5并无表单数量限制,本地便不会复现。
2、查看php版本
*使用phpinfo()函数
*在linux或者windows命令行 php -v