【发布时间】:2016-05-07 15:27:37
【问题描述】:
作为 PHP 和 MySQL 的新手,我在这里阅读了很多东西。 This post 是我能找到的与我的问题相关的最接近的问题。我从解决方案中借了一些,但它只让我到目前为止。
我用来自SELECT 语句的表数据填充了一个表单,目前为 15 行。结果中的每一行都有一个复选框和相应的数据。表单中还有一个文本区域。
我需要将来自 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 错误日志会显示“未定义变量:insertGroup”和/或“未定义变量:insertGroup”。
另外,我知道$_POST 变量的危险。我的数据库仅供内部使用,在我们的 Intranet 上。没有外部访问权限。
【问题讨论】:
-
如果您费心阅读 MySQL 的 INSERT 语法,并且实际上费心检查您的查询调用是否真的成功,您就会被告知您的 sql 语法错误。但相反,你选择了“不会出错”的编程学校,现在你正在为此受苦。在处理外部资源时,永远不要永远假设成功。始终假设失败,检查失败,并将成功视为惊喜。