提问人:MauiRiis 提问时间:2/23/2022 最后编辑:mickmackusaMauiRiis 更新时间:3/1/2022 访问量:84
基于两个相关数据库表打印两个列表
Print two lists based on two related database tables
问:
我有这 2 个 while 循环。
圈。左侧屏幕。显示附加到任务的用户。
$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 = $getPostID ORDER BY u.Fname"); $getcurrentusers->execute(); $resultgetcurrentusers = $getcurrentusers->get_result(); $getcurrentusers->close(); if ($resultgetcurrentusers->num_rows > 0) { while($row = $resultgetcurrentusers->fetch_assoc()) { echo $row["username"]." (".$row["Fname"].")<br />"; } } else { echo "Der er ikke valgt nogle ansvarlige til denne opgave."; }
圈。右侧屏幕。列出可添加到任务的所有可能用户
$getdepartmentview = $SetDepartmentView; $explodegetdepartmentview = explode(",",$getdepartmentview); $implodegetdepartmentview = "'".implode("','",$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()) { echo "<input type=\"checkbox\" name=\"choose_responsible[]\" value=\"".$row["userid"].",\" />".$row["Fname"]."<br />"; } }
问题是,我真的很想,当左侧 1 有匹配项时,输入复选框在右侧被“选中”。圈。
所以。。
Loop 1 | Loop 2
name3 | name1
name5 | name2
name7 | name3 - Inputbox checked
name8 | name4
| name5 - Inputbox checked
| name6
| name7 - Inputbox checked
| name8 - Inputbox checked
| name9
| name10
答:
3赞
Valeriu Ciuca
2/23/2022
#1
在第一个循环中,您可以将user_id存储在数组中
$user_ids[] = $row["userid"]
在第二个循环中,检查当前用户 ID 是否存在于之前保存的 $user_ids 数组中
$checked = false;
if (in_array($row["userid"], $user_ids)) {
$checked = true;
}
评论
0赞
mickmackusa
2/23/2022
循环调用可能是所有比较技术中表现最差的。in_array()
1赞
Valeriu Ciuca
2/23/2022
更快的方法是在第一个循环中存储 $user_ids[$row[“userid”]] = 1,并在第二个循环中检查 isset($user_ids[$row[“userid”]])。OP正在学习,我不认为过多地考虑性能。
1赞
RBC
2/23/2022
对于具有大量迭代的in_array的性能,您应该参考此 stackoverflow.com/questions/324665/...但@stackoverflow.com/users/4527645/valeriu-ciuca 是对的,提问者没有考虑性能。
0赞
mickmackusa
2/24/2022
#2
此任务在单个查询中调用 LEFT JOIN,以避免多次访问数据库,并避免结果集上的低效 php 进程。
$sql = <<<SQL
SELECT u.userid,
u.username,
u.Fname,
u.inactive,
r.userid responsibleUserId,
r.job_id
FROM users AS u
LEFT JOIN job_responsible AS r
ON u.userid = r.userid
AND r.job = ?
WHERE u.inactive = 0
ORDER BY u.Fname
SQL;
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $getPostID);
$result = $stmt->execute();
$users = $result->fetch_all(MYSQLI_ASSOC);
现在,您拥有了所需的所有数据,因此没有理由访问数据库。
若要列出分配给目标作业的用户,请循环访问关联数组,并向用户显示其中 where is not null。job_id
foreach ($users as $user) {
if ($user['job_id']) {
printf('%s (%s)<br />', $user['username'], $user['Fname']);
}
}
要显示所有用户并有条件地选中已“负责”的名称旁边的支票框,请再次迭代数组并依赖来确定复选框。job_id
foreach ($users as $user) {
printf(
'<input type="checkbox" name="choose_responsible[]" value="%d"%s/>%s<br />',
$user['userid'],
$user['job_id'] ? ' checked' : '',
$user['Fname']
);
}
下一个:非常慢的循环 PHP
评论
r.job_id