Moodle 4.3自定义Mod插件预览生成测验时数据库查询错误
Moodle 4.3 Mod插件预览测验时数据库记录找不到错误
问题描述
我正在开发Moodle 4.3的Mod插件,流程为:接收PDF文件输入→解析内容→调用GPT-4 API生成10道基于PDF内容的选择题。目前mdl_question表及分类、题库相关表均已正常填充数据,但预览测验时触发以下错误:
Can't find data record in database Debug info: SELECT quid, qc.id as category, q.parent, q.name, q.questiontext, q.questiontextformat, q.generalfeedback, q.generalfeedbackformat, q.defaultmark, q.penalty, q.qtype, q.length, q.stamp, q.timecreated, q.timemodified, q.createdby, q.modifiedby, qbe.idnumber, qc.contextid, qv.status, qv.id as versionid, qv.version, qv.questionbankentryid FROM (question) q JOIN {question_versions) qv ON qv.questionid = q.id JOIN (question_bank_entries) qbe ON qbe.id = qv.questionbankentryid JOIN (question_categories) qc ON qc.id = qbe.questioncategoryid WHERE q.id = id [array ( 'id' => 's61', Error code: invalidrecordunknown Stack trace: • line 1686 of \lib\dmi\moodle_database.php: dml_missing_record_exception thrown line 694 of \question\engine\bank.php: call to moodle_database->get_record_sql() line 600 of \cache\classes\loaders.php: call to question_finder->load_for_cache() • line 418 of \cache\classes\loaders.php: call to cache->get_implementation() line 530 of \question\engine\bank.php: call to cache->get() line 257 of \question\engine\bank.php: call to question_finder->load_question_data() line 275 of \question\engine\bank.php: call to question_bank::load_question_data() • line 190 of \mod\quiz\locallib.php: call to question_bank::load_question() line 2056 of \mod\quiz\locallib.php: call to quiz_start_new_attempt() line 110 of \mod\quiz\startattempt.php: call to quiz_prepare_and_start_new_attempt()
核心疑问:系统为何会搜索以s开头的ID(如s61),而mdl_question的ID应为纯数字自增字段;已对比手动生成测验与插件生成测验的数据库表数据,未发现明显差异。可提供插件的lib.php和view.php文件,寻求技术帮助。
排查方向
- 检查测验-题目关联逻辑:确认插件调用
quiz_add_quiz_question()等核心函数时,传入的questionid是否为mdl_question表的纯数字主键,而非带s前缀的字符串。 - 校验题目关联表数据:核对
mdl_question_versions、mdl_question_bank_entries表中的关联ID是否为有效纯数字,且与对应表的主键匹配。 - 清除Moodle缓存:错误涉及缓存加载,执行后台「站点管理→开发→清除缓存」操作,排除旧缓存数据干扰。
- 检查题目ID生成逻辑:确认插入
mdl_question时,是否通过Moodle原生insert_record()函数获取自动生成的ID,而非手动拼接带前缀的ID。
内容的提问来源于stack exchange,提问作者Laurențiu-Flavius Istrate
相关产品推荐
相关产品推荐

