如何在双列表中实现已关联用户的自动勾选

8次阅读

如何在双列表中实现已关联用户的自动勾选

本文介绍如何通过 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 缓存部门用户结果,减少数据库压力。

通过以上改造,左右两侧列表逻辑解耦、语义明确,既满足业务需求,又兼顾安全性、可维护性与用户体验。

text=ZqhQzanResources