请帮我调试这个PHP代码

时间:2012-09-19 10:17:53

标签: php html forms checkbox

早上好,

我有一个表单,用于一次将多行添加到数据库中。除了复选框之外,它似乎都运行良好。每个表单行都有一个复选框。无论勾选复选框的顺序如何,结果总是在提交后以相同的顺序返回。

以下是表格的主要部分:

<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 []的名称?

在这个问题上是否存在问题,或者我是否会更好地使用单选按钮,一个用于是,一个用于否?

非常感谢

2 个答案:

答案 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代码,可能还有更多内容需要更新。