我有一个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