假设我有一个表格,包含输入和复选框:
<form method='post' action=''>
<table>
<tr>
<th>Code</th>
<th>Description</th>
<th>Select</th>
</tr>
<tr>
<td><input name=table[code][] type='text' value='C001' /></td
<td><input name=table[description][] type='text' value='Object 1' /></td>
<td><input name=table[select][] type='checkbox' checked /></td>
</tr>
<tr>
<td><input name=table[code][] type='text' value='C002' /></td
<td><input name=table[description][] type='text' value='Object 2' /></td>
<td><input name=table[select][] type='checkbox' /></td>
</tr>
<tr>
<td><input name=table[code][] type='text' value='C003' /></td
<td><input name=table[description][] type='text' value='Object 3' /></td>
<td><input name=table[select][] type='checkbox' checked /></td>
</tr>
</table>
</form>
该表由PHP填充并由用户扩展(通过jQuery脚本),因此我不知道在发布表单时我将拥有多少行
在$ _POST中我找到这些值(不是PHP代码,只显示$ _POST内容):
$_POST['table']['code'][0] = C001
$_POST['table']['code'][1] = C002
$_POST['table']['code'][2] = C003
$_POST['table']['description'][0] = Object 1
$_POST['table']['description'][1] = Object 2
$_POST['table']['description'][2] = Object 3
$_POST['table']['select'][0] = 1
$_POST['table']['select'][1] = 1
如您所见,“select”字段与“code / description”
之间没有相关性我的解决方案是添加数组的索引,如下所示:
<td><input name=table[code][1] type='text' value='C001' /></td>
<td><input name=table[description][1] type='text' value='Object 1' /></td>
<td><input name=table[select][1] type='checkbox' checked /></td>
并检查if(isset(&_POST['table']['select'][1]))
但这对我来说并不是一个优雅的解决方案,因为它需要在填充表时对字段进行编号,并在添加新行时更新jQuery中的数字。
有没有更好的解决方案来保持每一行的输入?
答案 0 :(得分:0)
我认为您的解决方案是最好的,您必须将相关字段组合在一起,并且,如果未检查checkbox
元素,则最好的方法是使用唯一ID。< / p>
不过,还有其他解决方案。在我的头顶,有一个,这涉及一点jQuery
并且丑陋如f ** k,但应该工作:
<form method='post' action=''>
<table>
<tr>
<th>Code</th>
<th>Description</th>
<th>Select</th>
</tr>
<tr>
<td><input name="table[code][]" type='text' value='C001' /></td>
<td><input name="table[description][]" type='text' value='Object 1' /></td>
<td>
<input type="checkbox" checked />
<input name="table[checkbox][]" value="1" />
</td>
</tr>
<tr>
<td><input name="table[code][]" type='text' value='C002' /></td>
<td><input name="table[description][]" type='text' value='Object 2' /></td>
<td>
<input type='checkbox' checked />
<input name="table[checkbox][]" value="0" />
</td>
</tr>
<tr>
<td><input name="table[code][]" type='text' value='C003' /></td
<td><input name="table[description][]" type='text' value='Object 3' /></td>
<td>
<input type='checkbox' checked />
<input name="table[checkbox][]" value="1" />
</td>
</tr>
</table>
</form>
<script type="text/javascript">
$('input[type="checkbox"]').on('change', function() {
var target = $(this).parent('td').find('input[type="hidden"]');
if ($(this).is(':checked')) {
target.val(1);
} else {
target.val(0);
}
});
</script>
我从您的复选框中删除了name
个属性,并添加了同名的hidden
个字段。
当复选框的状态发生变化时(从已选中状态变为未选中状态,反之亦然),jQuery位会将相应的hidden
输入值设置为1
(如果复选框已被取消) )或0
。
答案 1 :(得分:0)
您的复选框输入中也可能包含值。然后,您可以在提交时根据您的代码进行检查。
我还没有测试过上面的代码,但是我会做点什么。
<td><input name=table[code][] type='text' value='C003' /></td>
<td><input name=table[description][] type='text' value='Object 3' /></td>
<td><input name=table[select] value='C003' type='checkbox' checked /></td>
在你的后端:
$checkedCodes = explode(',', $_POST['table']['select']); //all the values would be separated by ,
for ($i = 0; $i < count($_POST['table']['code']; $i++) {
$code = $_POST['table']['code'][$i];
$description = $_POST['table']['description'][$i];
$checked = in_array($checkedCodes, $code);
}