Php MySQL更新";链接“;桌子

Php MySQL更新";链接“;桌子,php,mysql,Php,Mysql,我有一个表用户和一个表销售人员 我想将销售人员分配给用户。一个销售人员可以链接到多个用户 因此,我制作了一个users\u salesman“linking”表,其中包含columsuser\u id和salesman\u id 我有一个可以链接它们的页面 | Salesemen 1| Salesmen 2 | Salesmen 3 | -------|------------|-------------|------------| User 1 | checkbox |

我有一个表
用户
和一个表
销售人员

我想将销售人员分配给用户。一个销售人员可以链接到多个用户

因此,我制作了一个
users\u salesman
“linking”表,其中包含colums
user\u id
salesman\u id

我有一个可以链接它们的页面

       | Salesemen 1|  Salesmen 2 | Salesmen 3 |
-------|------------|-------------|------------|
User 1 | checkbox   |  checkbox   | checkbox   |
-------|------------|-------------|------------|
User 2 | checkbox   |  checkbox   | checkbox   |
-------|------------|-------------|------------|
User 3 | checkbox   |  checkbox   | checkbox   |
-------|------------|-------------|------------|
该复选框以HTML格式显示:

<input type="checkbox" name="user_id[6][]" value="3" />
这将导致
用户与销售人员之间的冲突

salesmen_id  |   user_id
------------ |------------
    1        |     1
    2        |     2
    2        |     3
    3        |     1
    3        |     3 
所以我的问题是,在做了一些更改之后,如何更新表。
我一直这样做:

  • 删除
    users\u salesman
  • 循环输入,选中的人将被插入
    用户\u销售人员
这是正确的方法,还是有更好的方法更新数据?

你说“一个销售人员可以链接到多个用户。”。如果这是真的,反之亦然(“一个用户可以链接到多个销售人员”),那么下面是一个很好的解决方案

在用户表中有一个“saller\u id”列,只需将saller id添加到相关用户行中即可。然后,salesmen表将只包含销售人员详细信息及其id-users表将包含分配给他们的销售人员id。每个销售人员可以分配多个用户。

您说“一个销售人员可以链接到多个用户。”。如果这是真的,反之亦然(“一个用户可以链接到多个销售人员”),那么下面是一个很好的解决方案


在用户表中有一个“saller\u id”列,只需将saller id添加到相关用户行中即可。然后,salesmen表将只包含销售人员详细信息及其id-users表将包含分配给他们的销售人员id。每个销售人员可以分配几个用户。

更新复选框列表是一件痛苦的事情,但最简单/最干净的方法基本上就是你正在做的事情:

start transaction
delete old stored checkbox data
insert all checkboxes from form
commit transaction
否则,您将不得不获取旧列表,将其与新列表进行比较,并构建单独的插入/删除查询来删除任何“未选中”的框并插入任何“已选中”的框


用核武器把所有旧的东西都装进去,再把所有新的东西都装进去,这就容易多了。事务保证您最终得到一致的结果,并在您实际提交之前对其他并行代码隐藏删除/插入操作。

更新复选框列表是一件痛苦的事情,但最简单/最干净的方法基本上就是您正在做的事情:

start transaction
delete old stored checkbox data
insert all checkboxes from form
commit transaction
否则,您将不得不获取旧列表,将其与新列表进行比较,并构建单独的插入/删除查询来删除任何“未选中”的框并插入任何“已选中”的框


用核武器把所有旧的东西都装进去,再把所有新的东西都装进去,这就容易多了。事务保证您最终得到一致的结果,并在您实际提交之前对其他并行代码隐藏删除/插入操作。

我同意@MarcB的观点,您的方法是最好的。无论如何,为了便于讨论,我可以建议您使用另一种方法,即使用array_diff仅获取要添加的内容和要删除的内容:

function array_diff_ORG_NEW(&$org, &$new, $type){
    switch($type){
        case 'VALUES':
            $int = array_values(array_intersect($org, $new)); //C = A ^ B
            $org = array_values(array_diff($org, $int)); //A' = A - C
            $new= array_values(array_diff($new, $int)); //B' = B - C
            break;
        case 'KEYS':
            $int = array_values(array_intersect_key($org, $new)); //C = A ^ B
            $org = array_values(array_diff_key($org, $int)); //A' = A - C
            $new= array_values(array_diff_key($new, $int)); //B' = B - C
            break;
    }
}

这将查看键或值,并为您提供所有要添加或删除的项。

我同意@MarcB的观点,您的方法是最好的。无论如何,为了便于讨论,我可以建议您使用另一种方法,即使用array_diff仅获取要添加的内容和要删除的内容:

function array_diff_ORG_NEW(&$org, &$new, $type){
    switch($type){
        case 'VALUES':
            $int = array_values(array_intersect($org, $new)); //C = A ^ B
            $org = array_values(array_diff($org, $int)); //A' = A - C
            $new= array_values(array_diff($new, $int)); //B' = B - C
            break;
        case 'KEYS':
            $int = array_values(array_intersect_key($org, $new)); //C = A ^ B
            $org = array_values(array_diff_key($org, $int)); //A' = A - C
            $new= array_values(array_diff_key($new, $int)); //B' = B - C
            break;
    }
}

这将查看键或值,并为您提供所有要添加或删除的项。

我认为您的过程不可行。因为,若只允许在UI中更新行(在HTML中),那个就意味着一次只允许为单个用户更新数据。所以,在那个时候,您应该只删除和重新插入该用户的数据,其他用户应该保持不变。
但是,如果允许您在一次调用中修改多个用户记录,那么您必须删除该链接(映射)表的所有记录并重新插入它们。

我认为您的过程不可行。因为,若只允许在UI中更新行(在HTML中),那个就意味着一次只允许为单个用户更新数据。所以,在那个时候,您应该只删除和重新插入该用户的数据,其他用户应该保持不变。
但是,如果允许您在一次呼叫中修改多个用户记录,则必须删除该链接(映射)表的所有记录并重新插入。

谢谢您的回答。我已经接受了Marc B的答案,但是我的努力给了你a+1!不错的选择!谢谢你的回答。我已经接受了Marc B的答案,但是我的努力给了你a+1!不错的选择!