对PHP和MySQL不熟悉,我在这里读了很多东西。 This post是关于我的问题我能找到的最接近的问题。我从解决方案中借了一些,但到目前为止它只得到了我。
我使用来自SELECT
语句的表数据填充表单,当前为15行。结果中的每一行都有一个复选框和相应的数据。表格中还有一个textarea。
我需要将textarea中的文本输入以及与复选框关联的Case_No
和Client_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 <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
变量的危险性。我的数据库仅在内部网上使用。没有外部访问权。
答案 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;
}
}
绑定中的一些括号可能是不必要的,但我不是开发人员。它对我有用,希望它有助于某人。