从带有复选框的表单中提取特定值以选择PHP

时间:2017-01-10 19:29:50

标签: php mysql checkbox

我有一个表格,其中包含从表格查询中的行生成的多行。每行都有文本框和从表查询预先填充的下拉框。如有必要,这允许用户在提交之前对行中的值进行更改。但是,只应将具有所选复选框的行插入表中。

因此,如果我有15行并且只选择了10个复选框,那么如何仅使用复选框插入10行并忽略来自没有选中复选框的行的数据的数组值?

WHILE ($row = $query->fetch(PDO::FETCH_ASSOC)) { ?>

<input type="hidden" name="RB_TG_ID[]" value="<? echo $row['RB_TG_ID'] ?>">
<input type="hidden" name="state_id" value="<? echo $state_id ?>">
<input type="hidden" name="rpt_id" value="<? echo $rpt_id ?>">
 <tr>

<td class="normal"><input type="checkbox" name="CB[]" value="1"></td>
<td class="normal"><? echo $row['TG'] ?></td>
<td class="normal">
  <SELECT NAME="TS[]">
    <option SELECTED VALUE="<? echo $row['TS'] ?>"><? echo $row['TS'] ?>
    <option value="1">1</option>
    <option value="2">2</option>
  </select>
</td>
<td class="normal"><? echo $row['assignment'] ?></td>
<td>
  <SELECT NAME="access[]">
    <option SELECTED VALUE="<? echo $row['FP'] ?>"><? echo $row['FP'] ?>     </option>
    <option value="PTT">PTT</option>
    <option value="Full-Time">Full-Time</option>
    <option value="Sched"> Scheduled</option>
   </select>
 </td>
</tr>

以下是表单的内容:

https://i.stack.imgur.com/VF79X.jpg

正如您从表单中看到的那样,用户可以修改所有行,并且所有行都将在POST上发送它们的值,但复选框除外,该复选框仅发送&#34; 1&#34;如果选中。如果选中第一个复选框,我只对该行感兴趣。所有其他行和信息都可以隐藏,不会输入数据库。所以,如果我检查前三行和最少一行,在中间留下几个空白,我可以在数组上做一个print_r,我得到了这个:

Variables: 
00
1
CB: Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 ) 
TS: Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 2 [4] => 2 [5] => 2 [6] => 2 [7] => 2 ) 
TG: Array ( [0] => 1 [1] => 25 [2] => 7 [3] => 2 [4] => 31 [5] => 38 [6] => 65 [7] => 66 ) 
Access: Array ( [0] => PTT [1] => [2] => [3] => Full-Time [4] => PTT [5] => PTT [6] => PTT [7] => PTT ) 

带有00的第一行和带有1的第二行很好,因为它们将在每个插入的行上循环。

但是,我如何只插入与检查我选择的行的复选框相关的结果。正如您所看到的,虽然我检查了四个框和名为&#34; CB&#34;仅显示四个值,其余变量显示8个值。如何忽略这些值并使数组指针排成一行以便循环进入INSERT? checlbox似乎是我的问题,因为它只是在检查时发送一个值。所以,我不能为&#34; 1&#34;做一个if / then值。我尝试在实际复选框字段之前从隐藏字段发送CB []复选框值,但它只是向数组添加了另一个元素。意思是,如果有8个复选框并且我全部检查过,那么我最终会在1&#39; s和0&#39; s之间交替使用16个元素。

下面的评论是要求MySQL代码,但我还没有编写任何内容,除了在图像的示例中显示表单。我不知道如何将数组组织到数据行以便进入数据库。我想一旦它一对一排列,我会编写一个FOREACH循环来运行插入查询,用户可以选择多行。

1 个答案:

答案 0 :(得分:0)

您应该首先重构表单。如果将每一行组合在一起,则可以轻松匹配每行中的值。一个例子:

$i = 0;
while ($row = ...) :
    ?>
    <tr>
        <td><input type="checkbox" name="data[<?= $i ?>][CB]"></td>
        <td><select name="data[<?= $i ?>][TS]">...</select></td>
        <td><select name="data[<?= $i ?>][access]">...</select></td>
    </tr>
    <?php
    $i++;
endwhile;

或者代替计数器($ i),您可以使用id,例如:

<input type="checkbox" name="data[<?= $row['RB_TG_ID'] ?>][CB]">

提交后检查$ _POST [&#39;数据&#39;]中的每一行,并仅保存带有复选框的记录:

foreach ($_POST['data'] as $row) {
    // If the checkbox is on
    if (isset($row['CB'])) {
        // Sanitize n' save this row
        // $ts = $row['TS'];
        // $access = $row['access'];        
    }
}