PHP MySQL 多 id 插入和设置名称


PHP MySQL multiple id insert and set name

我在我的网站上有这个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错误...