2014-10-07 73 views
1

我遇到了一个问题,即使用AJAX通过POST发送的大型数据集未在PHP中使用$_POST变量。POST数据在浏览器和PHP之间被截断

用户通过webform上传Excel/CSV文件,并通过AJAX进行分析。这个特殊的例子有775个记录,每个记录有13个字段/元素。添加正在提交的其他字段,并且数据集中的元素少于11,000个。从我在这个主题上所做的研究来看,32位浏览器(例如Firefox,Chrome等)应该能够处理42.9亿个元素,所以我没有看到数据大小的问题,特别是响应从文件上传包含所有元素。

当整个表单提交验证并输入到数据库中时,问题只会抬头。问题是,在两个萤火虫和Chrome开发者工具的控制台显示整个数据集被提交: Firebug Output

做的$_POST一个var_dump给出了这样的: enter image description here

php.ini中有'post_max_size'集到200M。即使'upload_max_filesize'设置为100M。这个问题发生在Firefox 32.0.3和Chrome 37.0.2062.103米,我已经测试过个人以及UAT测试过的其他旧版本(包括IE 10)。

的AJAX调用是:

new wrapper.ajax('/t1.php', { 
    type: 'POST', 
    data: data, 
    form: $('form[name=oppForm]'), 
    success: function (response) 
    { 
    if (response.result) 
    { 
     window.location = response.result; 
    } 
    }, 
    complete: function() 
    { 
    $("#submit").loading('done'); 
    } 
}); 

的PHP是:

<?php 
var_dump($_POST); 

有什么想法?

编辑

与其他一些开发人员交谈后,我还检查了输出的php://input,发现它确实包含整个POST数据浏览器进行发送,但该数据没有得到翻译成$ _POST正确。但是,如果我从帖子数据中删除了10个密钥,并且提交了765而不是775,它确实能够正常工作。

+2

同时检查'max_input_vars'和'max_input_nesting_level'(后者在你的情况下应该不那么重要)。并检查是否f.e. suhosin用于运行你的PHP代码,它对传入数据的安全性有额外的限制。 – CBroe 2014-10-07 16:08:35

+0

如果在Apache上运行,还有[limitrequestbody](http://httpd.apache.org/docs/2.0/mod/core.html#limitrequestbody)需要考虑。 – naneau 2014-10-07 16:09:19

+1

一位开发人员建议我查看“php:// input”和$ _POST之间的区别。 file_put_contents('/ tmp/zelda4.log',print_r(file_get_contents(“php:// input”),true)); file_put_contents('/ tmp/zelda5.log',print_r($ _ POST,true)); ' 而“php:// input”确实包含浏览器声称发送的所有预期内容,但$ _POST仍未显示全部内容。 – 2014-10-07 16:24:24

回答

3

问题最终导致在php.ini文件中设置的不够高。该值设置为10,000,并且用户提交了接近11k的数据,因此其中一些数据被截断。将此值更改为更大的值解决了问题。