更新选定的复选框数据并删除未选中的数据

时间:2015-04-20 03:47:56

标签: php mysql

假设我有用户数据库,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."'");

1 个答案:

答案 0 :(得分:1)

如果您想坚持当前的数据库设计,那么您的方法实际上是您可以做的最简单的方法。将此逻辑移至MySQL将非常困难,并且与您的解决方案相比没有任何优势。看起来您的方法已经处理了为向用户添加组而发布的所有要求,并且删除组的逻辑几乎相同。

但是,我强烈建议您更改数据库设计。完全删除base_u_group列,并创建一个包含两列user_groupsuser_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}$gid2会发生什么情况(在这种情况下您显然不想添加它)。您迭代$data的每个元素,因此在第一次迭代时,$data[i]1。自1 != 2起,您更新了表格,并在最后添加了另一个2

根据我的更改,我首先遍历data的所有元素,并确保它们都不等于$gid,并且只有在这种情况下我运行一次查询才能追加$gid 1}}在最后。

不幸的是,从您的代码中不清楚您为删除发出了什么样的请求,但逻辑将类似。您将遍历data的每个元素,如果其中任何元素等于您要删除的元素,则只需将其从data中删除并从循环中断开。然后implode data UPDATE并使用{{1}}查询将其存储到数据库中。