You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击统计数跳转URL传递用户ID异常,求助排查代码问题

问题分析与解决方案

你的代码核心问题出在clearedmodule()函数的逻辑实现上,导致生成的用户ID串出现重复、错误拼接的情况,下面具体拆解问题并给出修复方案:

关键问题点

  1. 变量覆盖与逻辑错位:
    • 你在foreach($row1 as $cname => $id)中把循环变量命名为$id,直接覆盖了函数开头定义的$id变量,导致每次循环都会丢失之前拼接的ID内容。
    • 错误地拼接了外层循环的$row['id'](来自tbl_users的id),但实际上你需要的是内层查询得到的user_id(符合测验条件的用户ID)。
  2. 冗余嵌套查询:外层循环遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:29:14