早上好,
我有一个表单,用于一次将多行添加到数据库中。除了复选框之外,它似乎都运行良好。每个表单行都有一个复选框。无论勾选复选框的顺序如何,结果总是在提交后以相同的顺序返回。
以下是表格的主要部分:
<tr>
<td class='border'>
<input type='text' name='rowid[]' value='".$row."' style='display:none;' />
<input type='text' name='ref[]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='obs[]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='act[]' style='width:100%;' />
</td>
<td class='border' align='center'>
<input type='checkbox' name='comp[]' value='Yes' />
</td>
<td class='border'>
<input type='text' name='compby[]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='compdate[]' id='completeddate".$row."' class='completeddate' style='width:100%;' />
</td>
</tr>
此表单已提交,我的PHP代码处理它。您可以看到第一个输入是表单行的ID。这是一个隐藏字段,对于表单中显示的每一行,值都会加1。
提交表单后,我使用下面的PHP来处理每一行,一次一个
foreach($_POST['rowid'] as $key=>$rowid) {
这应该基本上说对于rowid,其余的输入是关联的,直到它到达下一个rowid。
如果我要打印说
echo $_POST['ref'][$key];
我将获得第一行的引用,然后一旦循环完成并再次打印它,我将得到第二行的引用,依此类推。
但是,如果我要把
echo $_POST['comp'][$key];
然后就是它破裂的地方。
比方说,例如,对于每一行,我按此顺序勾选了复选框:
row 1, tick, row 2, untick, row 3, tick
如果我然后让循环打印出所有复选框值,它将显示
'Yes', 'Yes', ''
但它应该按此顺序
'Yes', '', 'Yes'
这是因为复选框是正常的数组,然后我将它放入另一个数组,给它一个comp []的名称?
在这个问题上是否存在问题,或者我是否会更好地使用单选按钮,一个用于是,一个用于否?
非常感谢
编
答案 0 :(得分:1)
尝试订阅数组索引。即通过将comp[]
更改为comp[$row]
,明确指出comp[]
属于哪一行。重点是未发送未选中的框,因此如果未检查所有框,则请求中只有2个$_POST['comp'][$key]
元素,您无法分辨它们属于哪一行。
顺便说一下,在访问最后一个(不存在的)$key
的{{1}}时,您应该收到警告。如果没有,请启用所有警告。警告通常非常有用。
答案 1 :(得分:1)
在表单中创建技术隐藏字段的正确方法是使用hidden
类型。无论如何,你在这里不需要这个字段。相反,请在所有字段中使用$row
来正确识别它们:
<tr>
<td class='border'>
<input type='text' name='ref[<?php echo $row; ?>]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='obs[<?php echo $row; ?>]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='act[<?php echo $row; ?>]' style='width:100%;' />
</td>
<td class='border' align='center'>
<input type='checkbox' name='comp[<?php echo $row; ?>]' value='Yes' />
</td>
<td class='border'>
<input type='text' name='compby[<?php echo $row; ?>]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='compdate[<?php echo $row; ?>]' id='completeddate<?php echo $row; ?>' class='completeddate' style='width:100%;' />
</td>
</tr>
更改循环(rowid
字段不再存在)。您可以循环访问任何text
字段,因为它们即使为空也会被提交(与复选框字段相反,仅在选中时提交):
foreach($_POST['ref'] as $key => $rowid) {
检查您的PHP代码,可能还有更多内容需要更新。