假设我有用户数据库,base_u_group
默认值为0,不属于任何群组。
1)base_users |base_u_id|base_u_username|base_u_group| ------------------------------------------ | 1 | username 1 | 0 | | 2 | username 2 | 2, 3, 4 | | 3 | username 3 | 4 | | 4 | username 4 | 3,5 |
列出所有用户。当属于该编辑组时,将自动检查$checkBox
。
echo "<tr>";
echo "<td>". $count .". ".$row_User['base_u_username']. "</td>";
echo "<td align=\"center\"><input type=\"checkbox\" class = \"group\" name=\"userList[]\" value=".$row_User['base_u_id']." ".$checkBox."/></td>";
echo "</tr>";
我的问题是如何插入所选复选框数据而不重复,例如:
3, 3, 4, 5 --> 3, 4, 5
当取消选中复选框时,它会删除base_u_group
中的该组,例如取消选中用户名2 第3组的复选框>
2, 3, 4 --> 2, 4
$gid
表示所选的编辑组。
这就是我到目前为止所做的:
<?php
$userGroup = $_POST['userList'];
foreach($userGroup as $a)
{
$selSQL = base_executeSQL("SELECT * FROM base_users WHERE base_u_id='".$a."'");
while($row_SQL = base_fetch_array($selSQL))
if($row_SQL['base_u_group'] != "0")
{
$data = explode(", ",$row_SQL['base_u_group']);
for($i=0; $i<count($data);$i++)
{
//insert to user group if base_u_group does not find the group ID
if($gid <> $data[$i])
base_executeSQL("UPDATE base_users SET base_u_group='".$gid. ", ". $row_SQL['base_u_group']."' WHERE base_u_id='".$a."'");
}
}
//if the user does not belong to any groups: base_u_group = 0
else
base_executeSQL("UPDATE base_users SET base_u_group='".$gid."' WHERE base_u_id='".$a."'");
}
?>
编辑:删除群组
$data = explode(", ",$row_SQL['base_u_group']);
$ok = true;
for($i=0; $i<count($data);$i++)
{
//insert to user group if base_u_group does not find the group ID
if($gid == $data[$i])
{
$arr = array_merge(array_diff($data,array($gid)));
$newArray = implode(", ",$arr);
base_executeSQL("UPDATE base_users SET base_u_group='".$newArray."' WHERE base_u_id!='".$row_SQL['base_u_id']."' AND base_u_domain='local'");
$ok = false;
}
}
if (ok) base_executeSQL("UPDATE base_users SET base_u_group='".$gid. ", ". $row_SQL['base_u_group']."' WHERE base_u_id='".$a."'");
答案 0 :(得分:1)
如果您想坚持当前的数据库设计,那么您的方法实际上是您可以做的最简单的方法。将此逻辑移至MySQL将非常困难,并且与您的解决方案相比没有任何优势。看起来您的方法已经处理了为向用户添加组而发布的所有要求,并且删除组的逻辑几乎相同。
但是,我强烈建议您更改数据库设计。完全删除base_u_group
列,并创建一个包含两列user_groups
和user_id
的新表group_id
。制作一个由两者组成的唯一键。现在添加一个组,只需INSERT
到该表中,唯一键将阻止您插入两次相同的组。从组中删除现在也与删除该表一样简单。要获取用户的所有组,只需执行SELECT group_id FROM user_groups WHERE user_id=$user_id
(通过适当的转义,或通过准备好的语句)。
您可能还会使user_id
成为当前表的外键,因此不允许插入无效的user_id
。此外,如果您有一个用于组的表,则将user_groups
中的外键添加到该表将有助于避免无效的组ID。
$data = explode(", ",$row_SQL['base_u_group']);
$ok = true;
for($i=0; $i<count($data);$i++)
{
//insert to user group if base_u_group does not find the group ID
if($gid == $data[$i]) $ok = false;
}
if (ok) base_executeSQL("UPDATE base_users SET base_u_group='".$gid. ", ". $row_SQL['base_u_group']."' WHERE base_u_id='".$a."'");
要了解您的代码错误的原因,请考虑如果$data = {1, 2}
和$gid
为2
会发生什么情况(在这种情况下您显然不想添加它)。您迭代$data
的每个元素,因此在第一次迭代时,$data[i]
为1
。自1 != 2
起,您更新了表格,并在最后添加了另一个2
根据我的更改,我首先遍历data
的所有元素,并确保它们都不等于$gid
,并且只有在这种情况下我运行一次查询才能追加$gid
1}}在最后。
不幸的是,从您的代码中不清楚您为删除发出了什么样的请求,但逻辑将类似。您将遍历data
的每个元素,如果其中任何元素等于您要删除的元素,则只需将其从data
中删除并从循环中断开。然后implode
data
UPDATE
并使用{{1}}查询将其存储到数据库中。