0

我的网站上有这个 POST 表单,旨在将未指定数量的用户分组。它的工作原理是在我的数据库中使用他们姓名旁边的复选框循环出所有用户。您勾选您想要的用户框,为组命名,然后提交表单。

为了完成上述操作,由于数据库的设置方式,我需要执行两个查询。该表称为 Participant/Group,它包含 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 的用户可以在一个名为 Group A 的组中,也可以在一个名为 Group C 的组中。需要有两个单独的行来记录这一点。使用上面的代码,它创建了单独的行,但它们都将具有上次在表单中提交的组名。

任何人都知道如何调整我的代码(如果需要,可以重新编写)来解决这个问题?

4

3 回答 3

1

在 implode 中添加组名

$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);");
于 2012-06-11T14:24:51.890 回答
0

它可以只使用一个查询来完成。此外,group还必须使用该字段进行清理mysql_real_escape_string以避免 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 来利用准备好的语句。

于 2012-06-11T14:23:46.807 回答
0
$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 错误的情况下工作......

于 2012-06-11T14:25:45.900 回答