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”表,其中包含columsuser\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。每个销售人员可以分配几个用户。更新复选框列表是一件痛苦的事情,但最简单/最干净的方法基本上就是你正在做的事情:
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!不错的选择!