我的网站上有此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的用户既可以在一个名为Group A的组中,也可以在一个名为Group C的组中。将需要有两个单独的行来进行记录。在上面的代码中,它正在创建单独的行,但是它们都将具有表单中最后提交的内容的组名。

有人知道如何对我的代码进行调整(如果需要,可以重写)以解决此问题?

最佳答案

可以仅使用一个查询来完成。另外,还必须使用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来利用准备好的语句,以提高性能和安全性。

关于php - PHP MySQL多个ID插入和设置名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10981826/

10-11 03:15
查看更多