今天碰到个小问题,有如下表单:

<form method="post" id="form" name="form" action="">
	<input type="text" id="a1" name="a[]" value="a1" /> <input type="checkbox" id="c1" name="c[]" value="c1" />
	<input type="text" id="a2" name="a[]" value="a2" /> <input type="checkbox" id="c2" name="c[]" value="c2" />
	<input type="text" id="a3" name="a[]" value="a3" /> <input type="checkbox" id="c3" name="c[]" value="c3" />
	<input type="text" id="a4" name="a[]" value="a4" /> <input type="checkbox" id="c4" name="c[]" value="c4" />
	<input type="text" id="a5" name="a[]" value="a5" /> <input type="checkbox" id="c5" name="c[]" value="c5" />
	<input type="text" id="a6" name="a[]" value="a6" /> <input type="checkbox" id="c6" name="c[]" value="c6" />
	<input type="submit" id="submit" name="submit" value="提交" />
</form>

提交并插入数据库,数据表中有字段a和c,a和c值要求一一对应,我们用PHP在接收数据,并插入数据库:

$a = $_POST['a'];
$c = $_POST['c'];
for ($i = 0;$i < count($a) ;$i++) {
	$a_i = $a[$i];
	$c_i = $c[$i];
	$conn->query("INSERT INTO table1(a,c) VALUES('$a_i','$c_i')");
}

运行上述代码,发现a和c的值未一一对应,如果checkbox未选中,它的值是不会通过post提交的,会缺失,也就造成了无法一一对应,那要怎么办呢?在checkbox控件前面多加一个隐藏域

<input type="text" id="a1" name="a[]" value="a1" /> <input type="hidden" id="h1" name="h[]" value="" /><input type="checkbox" id="c1" name="c[]" value="c1" />
<input type="text" id="a2" name="a[]" value="a2" /> <input type="hidden" id="h2" name="h[]" value="" /><input type="checkbox" id="c2" name="c[]" value="c2" />
.
.
.

然后对checkbox控件绑定一个click事件(我这里用的是jquery3.3),如下:

$(document).on('click', 'input[name="c[]"]', function () {
	var _this = $(this);
	if (_this.prop('checked')) {
		_this.prev().val(_this.val());
	}
	else {
		_this.prev().val('');
	}
	//console.log(_this.prev().val())
});

然后PHP后台接收:

$a = $_POST['a'];
$h = $_POST['h'];
for ($i = 0;$i < count($a) ;$i++) {
	$a_i = $a[$i];
	$c_i = $h[$i];
	$conn->query("INSERT INTO table1(a,c) VALUES('$a_i','$c_i')");
}