-1

大家早,

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

这是表格的主要部分:

<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。这是一个隐藏字段,表单中显示的每一行的值都会增加一。

提交表单后,我使用下面的 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[] 将它放入另一个数组?

无论如何,这个问题是否存在,或者我最好使用单选按钮,一个代表是,一个代表否?

非常感谢

编辑

4

2 回答 2

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

于 2012-09-19T10:37:42.620 回答
1

尝试下标数组索引。即通过将其更改为明确哪个comp[]属于哪一行comp[$row]。关键是未发送未选中的框,因此当并非所有框都被选中时comp[],请求中只有 2 个元素,并且您无法分辨它们属于哪一行。

$_POST['comp'][$key]顺便说一句,您在访问last (non-existent)时应该收到警告$key。如果没有,请启用所有警告。警告通常非常有用。

于 2012-09-19T10:30:30.590 回答