
本文介绍如何通过 php 一次性查询并比对两个数据库表(用户表与任务责任人表),在右侧可选用户列表中自动勾选左侧已分配的用户,提升任务管理界面的交互一致性与开发效率。
要实现右侧用户复选框()根据左侧已分配用户状态自动勾选,核心思路是:先收集所有已关联的用户 ID,再在渲染右侧列表时动态判断并添加 checked 属性。
✅ 步骤一:收集已分配用户 ID 到数组
在第一个查询(左侧已分配用户)的循环中,不直接输出 html,而是将 userid 存入一个索引数组:
$user_ids = []; // 初始化空数组 $getcurrentusers = $conn->prepare( "SELECT u.userid, u.username, u.Fname, u.inactive, r.userid, r.job_id FROM users AS u INNER JOIN job_responsible AS r ON u.userid = r.userid WHERE u.inactive = 0 AND r.job_id = ? ORDER BY u.Fname" ); $getcurrentusers->bind_param("i", $getPostID); // ✅ 使用参数化防止 SQL 注入 $getcurrentusers->execute(); $resultgetcurrentusers = $getcurrentusers->get_result(); $getcurrentusers->close(); if ($resultgetcurrentusers->num_rows > 0) { while ($row = $resultgetcurrentusers->fetch_assoc()) { $user_ids[] = (int)$row["userid"]; // 强制转为整型,确保类型安全 echo htmlspecialchars($row["username"]) . " (" . htmlspecialchars($row["Fname"]) . ")
"; } } else { echo "Der er ikke valgt nogle ansvarlige til denne opgave."; }
⚠️ 注意:已将原始 sql 中的 $getPostID 改为使用 ? 占位符 + bind_param(),彻底规避 SQL 注入风险;同时对输出内容使用 htmlspecialchars() 防止 xss。
✅ 步骤二:右侧列表渲染时动态添加 checked
在第二个查询(右侧可选用户)循环中,检查当前用户的 userid 是否存在于 $user_ids 数组中,并据此决定是否添加 checked 属性:
$getdepartmentview = $SetDepartmentView; $explodegetdepartmentview = explode(",", $getdepartmentview); $implodegetdepartmentview = "'" . implode("','", array_map('trim', $explodegetdepartmentview)) . "'"; // ✅ 增加 trim() 防空格干扰 $getusers = $conn->prepare( "SELECT userid, username, Fname, inactive FROM users WHERE departmentid IN ($implodegetdepartmentview) AND inactive = 0 ORDER BY Fname" ); $getusers->execute(); $resultgetusers = $getusers->get_result(); $getusers->close(); if ($resultgetusers->num_rows > 0) { while ($row = $resultgetusers->fetch_assoc()) { $userid = (int)$row["userid"]; $checked = in_array($userid, $user_ids) ? ' checked' : ''; $fname = htmlspecialchars($row["Fname"]); echo "
"; } } else { echo "Ingen brugere fundet i de valgte afdelinger."; }
? 提示:为提升可访问性,建议将 包裹在
✅ 补充建议:性能与健壮性优化
- 避免重复查询:若数据量较大,可考虑单次联合查询 + php 分组,但当前双查询结构清晰、职责分明,推荐保留。
- 空值/异常处理:确保 $SetDepartmentView 非空且格式合法(如正则校验 ^[0-9,\s]+$),防止 SQL 报错。
- 缓存考量:用户列表变动不频繁时,可引入 redis 或 APCu 缓存部门用户结果,减少数据库压力。
通过以上改造,左右两侧列表逻辑解耦、语义明确,既满足业务需求,又兼顾安全性、可维护性与用户体验。