获取表格第二行数据及用户两次课程尝试详情时出现数据重复异常求助
排查Moodle课程尝试记录重复显示的问题
嘿,看起来你在Moodle环境里获取用户课程尝试记录时遇到了头疼的问题——明明两次尝试状态不同(第一次失败、第二次通过),但页面显示的两条记录却完全一致。我来帮你梳理几个最可能的原因和排查方向:
1. 数据库查询条件或逻辑错误
这是最常见的原因,因为你用了Moodle的$DB类来获取数据,很可能是查询语句没有正确区分不同的尝试记录:
- 检查你的查询代码,比如是否只通过
userid和课程/测验ID来筛选,没有包含尝试记录的唯一标识(比如attempt.id),或者排序逻辑不对导致重复获取同一条记录。 - 建议先直接在数据库里执行SQL验证原始数据:
看看数据库里的两条记录SELECT id, userid, state, timestart, timefinish FROM mdl_quiz_attempts WHERE userid = [你的用户ID] AND quiz = [课程/测验ID] ORDER BY timestart ASC;state字段是不是真的一失败一通过,如果数据库里数据本身就不对,那问题出在数据写入环节;如果数据库里是对的,就继续排查展示逻辑。
2. 循环展示时变量引用问题
如果数据库里的数据是正确的,但页面显示重复,大概率是遍历结果时的变量处理错误:
- 比如你可能在循环外创建了一个对象,然后在循环里重复修改这个对象的属性,最后把同一个对象多次加入结果数组(因为对象是引用传递):
这种情况下,// 错误示例: $attempts = $DB->get_records('quiz_attempts', ['userid' => $USER->id, 'quiz' => $quizid], 'id ASC'); $displayData = []; $tempObj = new stdClass(); // 循环外创建的对象 foreach ($attempts as $attempt) { $tempObj->state = $attempt->state; $tempObj->timefinish = $attempt->timefinish; $displayData[] = $tempObj; // 每次都加入同一个对象的引用 }$displayData里的所有元素都会指向最后一次循环修改的tempObj,导致显示完全一致。解决方法是在循环内部重新实例化对象:// 正确示例: $displayData = []; foreach ($attempts as $attempt) { $tempObj = new stdClass(); // 每次循环都创建新对象 $tempObj->state = $attempt->state; $tempObj->timefinish = $attempt->timefinish; $displayData[] = $tempObj; }
3. Moodle缓存干扰
Moodle自带缓存机制,可能你的查询结果被缓存了,导致获取到的是旧数据:
- 尝试清除Moodle的站点缓存(路径:站点管理 → 开发 → 清除缓存),然后刷新页面再测试。
- 或者在查询时显式禁用缓存,比如用
get_records的最后一个参数:$attempts = $DB->get_records( 'quiz_attempts', ['userid' => $USER->id, 'quiz' => $quizid], 'id ASC', '*', 0, 0, false // 禁用缓存 );
4. 页面输出逻辑重复
检查你的HTML输出部分,是不是不小心把同一段代码重复执行了两次,比如循环次数不对,或者输出时硬编码了第二次尝试的数据?
另外,你提供的代码片段只有页面开头部分,缺少关键的查询尝试记录的PHP代码和循环展示的HTML/PHP代码,如果上面的排查方向没解决问题,可以补充这部分代码,这样能更精准定位问题~
内容的提问来源于stack exchange,提问作者suresh
相关产品推荐
相关产品推荐

