2014-10-07 106 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的數據,因此其中一些數據被截斷。將此值更改爲更大的值解決了問題。