- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有多对多表结构和更新复选框表单。
目标是使用 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>
用户表
+----+-----------+
| id ¦ username ¦
+----+-----------+
| 1 ¦ user 1 ¦
| 2 ¦ user 2 ¦
+----+-----------+
项目表
+----+-----------+
¦ id ¦ title ¦
+----+-----------+
| 1 ¦ project 1 ¦
| 2 ¦ project 2 ¦
+----+-----------+
用户项目表
这个表根据它们的 id 关联上面的两个表
+----+-------------+---------+
| id ¦ project_id ¦ user_id |
+----+-------------+---------+
| 1 ¦ 1 ¦ 2 |
| 2 ¦ 2 ¦ 1 |
+----+-------------+---------+
我制作了一个复选框表单来添加和编辑这些值。在每个用户页面上,它显示项目表中的所有项目。然后查询 user_projects 表并找到匹配列表以将检查添加到复选框。
但是如何将这些值编辑到数据库中呢?我如何知道用户是否取消选中了先前选中的框或选中了空框并更新到数据库而不循环查询用户表上的 project_id 和 user_id 匹配项?
这是我希望最终结果达到的粗略概念。
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
}
}
}
}
这看起来根本不是一个好主意,因为我必须为项目表中的每个项目至少查询一次数据库。对于我认为是常见问题的问题,必须有更好的解决方案。我知道我只是在以错误的方式思考这个问题。
注意:我曾考虑过只序列化一个数组并将其粘贴到用户列中,但这是 Not Acceptable ,因为我无法将项目与用户关联起来,只有用户与项目相关,这会破坏目的。
我希望在没有任何 javascript 技巧的情况下实现这一点。
最佳答案
由于您的项目数量小到可以在一张表中显示,我完全赞成在提交时重写 user_projects
表的相关部分:
BEGIN TRANSACTION;
DELETE FROM user_projects WHERE user_id = $uid;
INSERT INTO user_projects (project_id, user_id)
VALUES ($proj1, $uid), ($proj2, $uid), ...;
COMMIT TRANSACTION;
请注意使用扩展的 INSERT
语法在一条语句中编写关联。
如果不需要,也可以删除 user_projects.id
,从而节省表中三分之一的空间。
关于PHP & Mysql 更新多对多关系与复选框形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/782575/
我是一名优秀的程序员,十分优秀!