
本文介绍如何通过php将两个数据库查询结果(已分配用户与可选用户)同步展示,并在右侧可选用户列表中自动勾选左侧已关联的用户,提升任务责任人管理界面的交互准确性与开发效率。
要在右侧“可添加用户”列表中精准标记出已在左侧“当前责任人”中出现的用户(即自动勾选对应复选框),关键在于跨查询状态共享:先遍历并缓存左侧已关联用户的 ID,再在右侧循环中实时比对并动态添加 checked 属性。
✅ 实现步骤详解
第一步:收集已分配用户 ID 列表
在第一个 while 循环中,不直接输出,而是将每个匹配用户的 userid 存入一个索引数组(如 $assignedUserIds)。注意:务必在执行第二个查询前完成该数组构建。第二步:在右侧循环中判断并渲染 checked 状态
遍历所有可选用户时,使用 in_array($row['userid'], $assignedUserIds) 判断该用户是否已被分配;若为 true,则在 标签中加入 checked 属性。
? 完整优化代码示例
当前责任人
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()) { echo htmlspecialchars($row["username"]) . " (" . htmlspecialchars($row["Fname"]) . ")
"; $assignedUserIds[] = (int)$row["userid"]; // 安全转为整型并存入 } } else { echo "Der er ikke valgt nogle ansvarlige til denne opgave."; } ?>可添加的责任人
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()) { $isChecked = in_array((int)$row["userid"], $assignedUserIds) ? ' checked' : ''; echo '
'; } } else { echo "暂无符合条件的可用用户。"; } ?>
⚠️ 注意事项与最佳实践
- SQL 注入防护:左侧查询已改用 bind_param() 绑定 $getPostID,强烈建议右侧 IN 子句也通过动态占位符重构(如生成 ?, ?, ? 并批量绑定),避免字符串拼接风险。
- XSS 防护:所有输出到 HTML 的用户字段(如 username、Fname)均使用 htmlspecialchars() 转义,防止脚本注入。
- 数据类型一致性:$assignedUserIds 中统一存储 (int) 类型 ID,比对时也强制转换,避免因字符串 '1' 与整数 1 比较导致的潜在问题。
- 用户体验增强:可为已勾选项添加 CSS 样式(如 .checkbox-checked + label { font-weight: bold; color: #2c6eb4; }),提升视觉辨识度。
通过以上结构化处理,即可在保持逻辑清晰、安全可靠的前提下,高效实现双列表联动勾选,显著提升后台任务分配模块的专业性与可用性。










