如何防止在表单提交时超过PHP Post Max Size


How to prevent PHP Post Max Size being exceeded on a Form submission

我有一个PHP网页上的表单,接受数据表(可编辑的网格),最终用户是在控制中,他们可以添加尽可能多的行,因为他们喜欢。其中一个字段也是一个TEXTAREA,这意味着每一行都有一个可变的大小。

如果post太大,它将被服务器拒绝,所有目标页面将看到一个空的$_POST。更糟糕的是,如果用户导航回输入页面,它将显示其初始空状态,丢失所有输入的数据,并且至少会惹恼最终用户。

我可以在PHP中增加POST_max_size的设置,但这样做只是推了它失败的边界。

我也可以在JavaScript中检查帖子的大小,在他们提交表单之前,理想情况下,他们添加每一行或改变文本区内容,但我不确定这将是多么准确或缓慢。这也意味着他们必须删除一些数据或行。

我能想到的唯一其他选项是,一旦他们单击submit按钮,通过AJAX在隐藏的表单中单独提交每一行。我不确定这是一个好主意,以数百个帖子取代一个帖子到服务器。

还有其他想法吗?

不发送整个数据网格,您可以只发送编辑过的行,就像它是使用javascript的单个表单一样。如果使用ajax在循环中发送每一行,即使它没有经过编辑,也会像发送整个数据网格一样阻塞服务器。当用户离开textarea时,只需发送一行数据,而不是发送仅修改一列的20k行数据。

我不知道你是如何管理编辑事件的,但是使用jQuery(为了简单起见)可能是这样的。

$(document).ready(function() {
    $('textarea, input').on('blur', function(e) {
       var $row = $(this).closest('tr')
       var data = { 
           id: $row.data('id'),
           input: $row.find('td input').val(),
           textarea: $row.find('td textarea').val()
       };
       // e.g. foo.php/1 
       $.post("foo.php/" + data.id, data)
        .success(function() { /* silent success */ })
        .fail(function() { alert('Error') })
    });
});
与html

<table>
    <tbody>
        <tr data-id="1">
            <td><input /></td>
            <td><textarea></textarea></td>
        </tr>
         <tr data-id="2">
            <td><input /></td>
            <td><textarea></textarea></td>
        </tr>
         <tr data-id="3">
            <td><input /></td>
            <td><textarea></textarea></td>
        </tr>
    </tbody>
</table>

示例jsfiddle https://jsfiddle.net/vt0a0udx

尝试修改php.ini

max_input_vars = 1000 to 10000