我在我的网站上有这个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的组中。需要有两个单独的行来记录此信息。使用上面的代码,它创建了单独的行,但它们都将具有表单中最后提交的组的名称。
任何人都知道如何修改我的代码(如果你愿意,可以重新编写)来解决这个问题吗?
答案 0 :(得分: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);");
答案 1 :(得分: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,以便在性能和安全性方面利用预准备语句。
答案 2 :(得分: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错误......