题库管理需兼顾多题型、可扩展与易导入,关键在question表字段设计:type用整型、options和answer存json、correct_answer统一json结构、difficulty用tinyint;excel导入须校验格式、列序及内容规范;前后端应协同实现动态渲染与安全比对。

题库管理不是“建个表再写几个增删改查”就能跑通的,关键在结构设计是否扛得住多题型、可扩展、易导入。ThinkPHP 5.1 是可行起点,但直接照搬 CRUD 模板会卡在填空题答案比对、多选题判分逻辑、Excel 导入字段映射这三处。
question 表字段怎么设计才不翻车
用一张 question 表统一存所有题型,比建 question_single、question_fill 等多张表更轻量也更易维护——前提是字段设计不偷懒。
-
type字段必须用整型(如 1=单选, 2=多选, 3=判断, 4=填空),不用字符串,避免后续 switch 判定时出现空格或大小写歧义 -
options和answer必须存 JSON 字符串,不是序列化或纯文本:前者能被json_decode($row['options'], true)安全解析,后者在多选题中支持["A","C"]这种结构,填空题则可存["null", "NULL", "None"]多标准答案 - 别把
correct_answer当成 varchar(255) 直接存 “A,C” ——它只适用于简单场景;真实业务中填空/简答需要数组,判断题需布尔语义,统一走 JSON 才能收敛判分逻辑 -
difficulty建议用 tinyint(1) 存 1~5,别用文字如 “简单”,否则排序、筛选、统计都得额外处理
Excel 导入时 phpspreadsheet 解析怎么不出错
导入失败八成不是代码问题,而是 Excel 文件本身踩了隐性坑。ThinkPHP 后台调用 PhpSpreadsheet\Reader\Xlsx 读取时,以下几点必须人工核对:
- 文件必须是 .xlsx 格式,不能是“另存为”出来的兼容模式(.xls),否则
getSheetIterator()可能返回空 - 首行表头严格按顺序:question_text、type、option_a、option_b、option_c、option_d、correct_answer、score、category;任意列错位,
$row['correct_answer']就会读成选项内容 - 填空题的
correct_answer单元格里不能有换行或不可见空格,否则trim()后仍可能含 \r\n,导致in_array()匹配失败 - 多选题答案必须用英文逗号分隔且无空格,如
A,C,E,不是A, C, E——后者explode(',', $raw)会产生带空格的元素,排序比对直接失效
后台表单如何根据题型动态渲染
ThinkPHP 的模板里硬写四套表单(单选/多选/判断/填空)会导致 JS 控制混乱、校验逻辑散落。正确做法是服务端一次性输出结构化数据,前端靠字段驱动渲染:
- 编辑题目时,控制器传入
$question = ['type'=>2, 'options'=>['A','B','C','D'], 'answer'=>['A','C']],模板用{:json_encode($question)}注入到 JS 变量 - 前端用 Vue 或原生 JS 根据
type切换 DOM:type===2 时显示四个选项输入框,并预填充options;type===4 时隐藏选项区,只留一个答案输入框 - 提交前 JS 把当前表单状态序列化成标准结构:
{type:2,options:['A','B','C','D'],answer:['A','C']},PHP 接收后直接json_encode()写入options和answer字段,不拼 SQL
自动阅卷时 paper_question.answer 和 exam_record.answer 怎么比对才可靠
阅卷不是简单 ==,不同题型必须走不同路径。最易忽略的是:标准答案存的是 JSON 字符串,考生答案是用户提交的原始字符串,二者类型不一致就必然判错。
- 单选/判断:先
json_decode($paperQuestion['answer'], true)得到标准答案(如'A'或true),再和$record['answer'](如'A')做 === 比较,避免 '1' == true 这类弱类型陷阱 - 多选:双方都转成小写、排序后的数组,
array_values(array_sort(array_map('strtolower', $std))) === array_values(array_sort(array_map('strtolower', $user))),注意array_values()重排键防止关联数组 key 不一致 - 填空:标准答案是 JSON 数组,
$stdAnswers = json_decode($paperQuestion['answer'], true),然后用in_array(strtolower(trim($userAnswer)), $stdAnswers),别忘了trim()去首尾空格
题型字段没做索引、JSON 字段没加校验、Excel 导入跳过空行检查——这些细节不提前堵住,上线后错题率高、教师反复反馈“系统判错了”,其实根本不是算法问题,而是数据入口没控住。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











