我在我的网站上有这个POST表格,旨在从未指定数量的用户中分组。它的工作原理是循环出我数据库中的所有用户,并在他们的名字旁边有一个复选框。您勾选所需用户的框,为组命名,然后提交表单。
为了完成上述工作,由于数据库的设置方式,我需要执行两个查询。该表称为参与者/组,它包含 3 列:idParticipant、idGroup 和 GroupName。这是我到目前为止所拥有的,但它有其缺陷:
$aParticipants = array_map('mysql_real_escape_string', $_POST['check']);
$pIn = implode("),(", $aParticipants);
$gIn = implode("', '", $aParticipants);
$query1 = mysql_query("INSERT INTO `Participant/Group` (`idParticipant`) VALUES ($pIn);");
$query2 = mysql_query("UPDATE `Participant/Group` SET GroupName = '".$_POST['group']."' WHERE idParticipant IN ('$gIn')");
因此,第一个查询将用户的 id 插入到数据库中,第二个查询将组名添加到每个新插入的 id 中。如果你能结合这两个查询,我认为它可以解决我所有的问题,但我很确定语法不允许它。
无论如何,上述代码的问题在于它用任何后续的重叠查询覆盖了数据库。这里要记住的重要一点是用户不限于一个组。ID 为 7 的用户可以位于名为组 A 的组中,也可以位于名为组 C 的组中。需要有两行单独的行来记录这一点。使用上面的代码,它正在创建单独的行,但它们都将具有上次在表单中提交的内容的组名。
有人知道如何调整我的代码(如果需要,可以重写)来解决此问题吗?
在内爆中添加组名
$aParticipants = array_map('mysql_real_escape_string', $_POST['check']);
$group = mysql_real_escape_string($_POST['group']);
$pIn = implode(", {$group}),(", $aParticipants);
$query1 = mysql_query("INSERT INTO `Participant/Group` (`idParticipant`, `GroupName`) VALUES ($pIn);");
只需使用一个查询即可完成。此外,还必须使用 mysql_real_escape_string
清理group
字段,以避免 SQL 注入攻击。
$aParticipants = array_map('mysql_real_escape_string', $_POST['check']);
$group = mysql_real_escape_string($_POST['group']);
$sqlvalues = array();
foreach ($aParticipants as $p) {
$sqlvalues[] = "('$p', '$group')";
}
$values = implode(',', $sqlvalues);
mysql_query("INSERT INTO `Participant/Group` (`idParticipant`, GroupName)
VALUES $values");
为了完整起见,为了性能和安全性,最好使用 MySQLi 或 PDO 来利用预准备语句。
$aParticipants = array_map('mysql_real_escape_string', $_POST['check']);
$participants = array();
foreach(aParticipants as $p) {
$participants[] = $p . ', ' . mysql_real_escape_string($_POST['group']);
}
$pIn = implode("),(", $participants);
$query1 = mysql_query("INSERT INTO `Participant/Group` (`idParticipant`, `GroupName`) VALUES ({$pIn})");
编辑这里的问题是$iPn
字符串末尾将包含导致 SQL 错误的,(
(在一列中仅插入一个值时没有)。
因此一行
$pIn = implode("),(", $participants);
必须替换为
$pIn = substr(implode("),(", $participants), 0, -3);
现在它应该可以工作而没有任何SQL错误...