点击统计数跳转URL传递用户ID异常,求助排查代码问题
问题分析与解决方案
你的代码核心问题出在clearedmodule()函数的逻辑实现上,导致生成的用户ID串出现重复、错误拼接的情况,下面具体拆解问题并给出修复方案:
关键问题点
- 变量覆盖与逻辑错位:
- 你在
foreach($row1 as $cname => $id)中把循环变量命名为$id,直接覆盖了函数开头定义的$id变量,导致每次循环都会丢失之前拼接的ID内容。 - 错误地拼接了外层循环的
$row['id'](来自tbl_users的id),但实际上你需要的是内层查询得到的user_id(符合测验条件的用户ID)。
- 你在
- 冗余嵌套查询:外层循环遍历
tbl_users的每条记录,每次都重复执行相同的内层查询,既浪费数据库资源,还会导致同一个ID被多次拼接。
修复后的函数代码
我们可以用JOIN语句合并两个表的查询条件,一次性获取符合要求的用户ID,同时修正变量逻辑问题:
function clearedmodule() { $ids = []; // 合并查询条件,一次性筛选出符合要求的用户ID $sql = "SELECT DISTINCT u.id FROM tbl_users u JOIN tbl_user_quiz q ON u.id = q.user_id WHERE u.status = 1 AND u.type = 3 GROUP BY q.user_id HAVING COUNT(DISTINCT q.module_id) = '" . $this->userQuestionModules() . "' AND SUM(q.cleared) = 0"; $res = mysql_query($sql); while($row = mysql_fetch_assoc($res)) { $ids[] = $row['id']; } // 将数组转为逗号分隔的字符串,空数组则返回空串 return implode(',', $ids); }
前端代码优化
你当前前端代码调用了两次clearedmodule(),会触发两次数据库查询,建议优化为仅调用一次:
<td>Not Cleared</td> <td> <?php $linkId = $rep->clearedmodule(); if($linkId) { $idsCount = count(explode(",", $linkId)); ?> <a href="reportNotCleared.php?Userid=<?php echo $linkId ; ?>"><?php echo $idsCount; ?></a> <?php } else { echo "0"; } ?> </td>
额外提示
mysql_*系列函数已被官方废弃,存在安全和兼容性风险,建议尽快迁移到mysqli_*或PDO扩展。- 如果
userQuestionModules()的返回值来自用户输入,一定要用预处理语句防止SQL注入。
内容的提问来源于stack exchange,提问作者Ansh
相关产品推荐
相关产品推荐

