PHP和Mysql使用复选框形式更新多对多的关系

use*_*119 7 php sql checkbox many-to-many

我有很多表结构和更新复选框表单.

目标是使用users_project表将users表与projects表相关联.这样,每个项目可以有很多用户,每个用户可以有很多项目.

每个用户编辑页面上的表单看起来都是这样的

<form action="#" method="post">
    <div>   
        <input type="checkbox" name="project_id[]" id="1" value="1">
        <label for="1">project 1</label>
        <br>

        <input type="checkbox" name="project_id[]" id="2" value="2">
        <label for="2">project 2</label>
        <br>
        <input type="hidden" name="editing">
        <input type="submit" id="submit" value="submit">
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

以下是三个表的示例.

用户表

+----+-----------+
| id ¦ username  ¦
+----+-----------+
| 1  ¦ user 1    ¦
| 2  ¦ user 2    ¦
+----+-----------+
Run Code Online (Sandbox Code Playgroud)

项目表

+----+-----------+  
¦ id ¦ title     ¦
+----+-----------+  
| 1  ¦ project 1 ¦
| 2  ¦ project 2 ¦
+----+-----------+    
Run Code Online (Sandbox Code Playgroud)

user_projects表

该表基于它们的id来关联上面的两个表

+----+-------------+---------+
| id ¦ project_id  ¦ user_id |
+----+-------------+---------+
| 1  ¦           1 ¦       2 |
| 2  ¦           2 ¦       1 |
+----+-------------+---------+
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个复选框表单来添加和编辑这些值.在每个用户页面上,它显示项目表中的所有项目.然后查询user_projects表并找到匹配列表以向复选框添加检查.

但是如何将这些值编辑到数据库中?我如何知道用户是否已取消选中以前选中的复选框或检查空框并更新到数据库而不在project_id和user_id的users表上循环查询匹配项?

这是我希望最终结果实现的粗略概念.

if ($_POST['editing']) { 
    $totalprojects = $_POST['editing']; 
    $query = " 
        SELECT *  
        FROM user_projects  
        WHERE user_id = user_id 
        AND project_id = project_id 
    "; 
    $result = $mysqli->query($query); 
    $count = $mysqli->affected_rows; 
    for($i=0; $i < $totalprojects; $i++) {  
        if ($count == 1) { 
            if ($box == checked){  
                //do nothing 
            } 
            else { 
                //delete from database 
            } 
        } 
        if ($count == 0) { 
            if ($box == checked){  
                //add to database 
            } 
            else { 
                //do nothing 
            } 
        } 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

这根本不是一个好主意,因为我必须至少为项目表中的每个项目查询一次数据库.必须有一个更好的解决方案,我想象的是一个常见的问题.我知道我只是想错了.

注意:我已经考虑过序列化一个数组并将其粘贴在用户列中,但这是不可接受的,因为我无法将项目与仅用户的用户联系到项目并且无法实现目的.

我希望这可以在没有任何javascript技巧的情况下实现.

Cha*_*rch 0

好吧,假设每个用户都有资格处理每个项目,那么在您的表单处理页面上,您需要执行以下操作:

$query = 'SELECT p.id AS project_id, u_p.id AS user_project_id '.
            'FROM projects AS p '.
                'LEFT JOIN user_projects AS u_p ON (u_p.project_id = p.id AND u_p.user_id = ?)';
Run Code Online (Sandbox Code Playgroud)

通过左加入,这将为您提供系统中所有项目的列表,并且仅当您正在编辑的用户已在该项目中时,第二列才会有值。user_id对于您提供的示例数据,这是您在1上查询时得到的结果:

+------------+-----------------+
| project_id | user_project_id |
+------------+-----------------+
|          1 |                 |
|          2 |               2 |
+------------+-----------------+
Run Code Online (Sandbox Code Playgroud)

然后循环遍历该查询的结果,对于每个结果,检查是否$_POST为相应的 发送了值project_id。如果发送了一个值(选中了复选框)并且该行为user_project_id空,请插入一行user_projects以添加此链接。如果未发送值(未选中复选框)并且user_project_id设置了该行,则删除该行user_projects作为user_project_id键。否则什么也不做,他们并没有改变以前的样子。

希望这很清楚,如果您想让我了解更多细节,请告诉我。