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










