插入选中复选框的数组

时间:2016-01-29 19:11:02

标签: php mysql arrays checkbox

对PHP和MySQL不熟悉,我在这里读了很多东西。 This post是关于我的问题我能找到的最接近的问题。我从解决方案中借了一些,但到目前为止它只得到了我。

我使用来自SELECT语句的表数据填充表单,当前为15行。结果中的每一行都有一个复选框和相应的数据。表格中还有一个textarea。

我需要将textarea中的文本输入以及与复选框关联的Case_NoClient_No插入到另一个表格中...仅在选中复选框的位置。每行只有文本相同。 INSERT中不应包含任何未选中的复选框。

我意识到答案可能是某种循环,但我没有太多从循环插入的经验,只显示循环数据。

这是我的表格:

<form method="post" name="group_note" action="group_test.php?Counselor=<?php echo $_GET['Counselor'];?>"/>
<table border="1" width="650" cellpadding="5" cellspacing="0" bordercolor="#999999">
<tr><th>Group Note</th></tr>
<tr><td><textarea name="Note" rows="10" cols="115"></textarea></td></tr>
<tr><th align="left">Select clients below to receive this group note &nbsp; <input type="submit" value="Add Group Note"></th></tr>
</table>
<table border="1" cellpadding="5" cellspacing="0" bordercolor="#999999">
<thead>
  <tr>
    <th bgcolor="#009999">Select</th>
    <th bgcolor="#009999">Name</th>
    <th bgcolor="#009999">Case No.</th>
    <th bgcolor="#009999">Client No.</th>
    </tr>
  </thead>
  <tbody>
<?php foreach ($dbh -> query($sql) as $row) { ?>        
<tr> 
        <td><input type="checkbox" name="groupselect[]" value="<?php echo $row['Case_No'];?>" /></td>
        <td><?php echo $row['FirstName']. " " . $row['LastName']; ?></td>
        <td><?php echo $row['Case_No']; ?></td> 
        <td><?php echo $row['Client_No']; ?><input type="hidden" name="Client_No" value="<?php echo $row['Client_No']; ?>"/></td>

<?php  }  ?>
</tbody>
</table>
    <input type="hidden" name="MM_insert" value="group_note">
</form>

插入声明:

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "group_note")) {
try
    {
        $dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_database; charset=utf8", $mysql_username, $mysql_password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $insertGroup = array();
        foreach ($_POST['groupselect'] as $i => $value) {
        $GroupNote_CaseNo=$_POST['groupselect'][$i];
        $GroupNote_ClientID=$_POST['Client_No'][$i];
        $GroupNote=$_POST['Note'];
        $insertGroup[]="(".$GroupNote_CaseNo.", ".$GroupNote_ClientID.", ".$GroupNote.")";
        $Note = "INSERT INTO group_note GroupNote_CaseNo, GroupNote_ClientID, GroupNote VALUES ". implode(", ", $insertGroup). "GroupNote_CaseNo=VALUES(GroupNote_CaseNo), GroupNote_ClientID= VALUES(GroupNote_ClientID), GroupNote=VALUES(GroupNote)";
        $stmt->execute();
        $stmt->closeCursor();       
    }
    }
    catch (Exception $e)
    {
    $message = 'Something not working right!!';
    }
}

当我选择两个或三个复选框并插入一些文字时,在提交时我会从var_dump($_POST['groupselect'])获得此结果

array(3) { [0]=> string(22) "(1518-R, 4, This note)" [1]=> string(22)
"(1534-R, 3, This note)" [2]=> string(22) "(4062-R, 3, This note)" }

ClientNo只显示一位数字,长度为三位数。如果我删除$GroupNote_ClientID=$_POST['Client_No']之后的[$ i],我将获得所有三位数字,但只能从所选的第一个复选框行中删除:

array(3) { [0]=> string(22) "(1518-R, 4, This note)" [1]=> string(22) 
"(1534-R, 3, This note)" [2]=> string(22) "(4062-R, 3, This note)" }

在任何情况下,都没有任何内容插入到表中。根据变量语法,PHP错误日志显示“Undefined variable:insertGroup”和/或“Undefined variable:insertGroup”。

另外,我知道$_POST变量的危险性。我的数据库仅在内部网上使用。没有外部访问权。

2 个答案:

答案 0 :(得分:0)

  

ClientNo仅显示一位数字,长度为三位数。如果我删除$ GroupNote_ClientID = $ _ POST [&#39; Client_No&#39;]之后的[$ i],我将获得所有三位数字,但只能从所选的第一个复选框行中删除

您在保存值的隐藏输入字段上使用了name="Client_No" - 您错过了用于复选框的[],因此您只获得最后一个值,而不是数组,但是仅仅是一个字符串。通过数字索引访问字符串将返回其单个字符。

现在将[]添加到隐藏输入字段的名称,您将无法在此处完成。对于type=checkbox,检查输入时只发送一个值;但所有隐藏字段都将被发送。由于生成的数组的索引是自动生成的,因此您将获得复选框值和隐藏输入值之间的差异。为了避免这种情况,您可以通过命名像这样的输入字段name="foo[0]"name="foo[1]"等来预先指定索引。如果对两个字段都这样做,您将获得正确匹配的值你的阵列。

但是你仍然需要考虑复选框数组中的索引可能“缺失”,而不是设置。所以你应该遍历隐藏的输入值数组 - 这将设置所有索引,没有间隙。然后使用当前索引检查checkbox数组是否具有给定键(isset)的相应元素。

您也可以使用您的客户编号,而不是数字数组索引。

如果您将复选框命名为name="foo[igf]&#34;,name="foo[dkh]&#34;等等,那么您将不再需要隐藏的输入字段 - 每个选中的复选框将自动与其客户编号相关联。

答案 1 :(得分:0)

所以,我终于开始工作了。首先,@ CBroe关于在表单中添加[]ClientNo的建议选择了我需要的第二个变量。另一部分涉及使用INSERT语句的占位符更改PREPARE语句。我可以归功于@Marc B吗?

我也绑定了这些值,但我确实认为接受$_POST输入是不安全的。我唯一的辩护是这不是一个面向公众的数据库。

以下是结果(表单没有改变,它仍然在原始问题中),与原作相比:

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "group_note")) {
try
{
$dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_database; charset=utf8", $mysql_username, $mysql_password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$insertGroup = array();
foreach ($_POST['groupselect'] as $i => $value) {
$GroupNote_CaseNo=isset($_POST['groupselect']) ? ($_POST['groupselect'][$i]) : null;
$GroupNote_ClientID=isset($_POST['ClientNo']) ? ($_POST['ClientNo'][$i]) : null;
$GroupNote=$_POST['Note'];
$insertGroup[]="(".$GroupNote_CaseNo.",".$GroupNote_ClientID.",".$GroupNote.")";
$Note = 'INSERT INTO group_note (GroupNote_CaseNo,GroupNote_ClientID,GroupNote) VALUES (:GroupNote_CaseNo, :GroupNote_ClientID, :GroupNote)';
$stmt=$dbh->prepare($Note);
$stmt->bindValue(':GroupNote_CaseNo', ($_POST['groupselect'][$i]));
$stmt->bindValue(':GroupNote_ClientID', ($_POST['ClientNo'][$i]));
$stmt->bindValue(':GroupNote', $_POST['Note']);
$stmt->execute();
$stmt->closeCursor(); 
}
}
catch (Exception $e)
{
$message = $e;
}
}  

绑定中的一些括号可能是不必要的,但我不是开发人员。它对我有用,希望它有助于某人。