php考试系统网页网站考试系统源码
php考试系统网页网站考试系统源码
去年帮一所职业学院改造机房考试环境,试系试系原系统用纸卷答题,统网统源改卷老师连续加班三天才统计完三百多份成绩。页网后来换成PHP写的站考简易考试系统,同样的试系试系考生量,交卷后十分钟全班成绩就导出了Excel。统网统源那套源码至今还挂在学校内网,页网偶尔有同行问我要,站考索性整理成文。试系试系
PHP做考试系统最大的统网统源好处是省事。不需要Java那套笨重的页网容器,也不用Node.js折腾依赖包,站考一个Apache加PHP环境,试系试系丢进`htdocs`就能跑。统网统源核心逻辑其实就三块:题库管理、页网在线答题、自动判分。题库用MySQL存,字段设计成`question_id`、`type`(单选/多选/判断)、`content`、`options`(JSON格式存选项)、`answer`、`score`。答题页用Ajax定时提交,防止考生刷新页面丢答案。
判分逻辑有个坑——多选题。如果答案存成"ABD"这种字符串,比对时得先拆成数组,再和考生提交的数组做差集。我最初偷懒用`in_array`逐个判断,结果漏选了还能得分,后来改成`array_diff`才算稳。判断题更简单,答案字段直接存1或0,提交时对比一下就完事。
前端界面别搞花哨的动画,考试系统讲究的是稳定和清晰。倒计时用JavaScript的`setInterval`,每30秒自动把当前答题进度POST到后台存草稿。有次机房突然断电,重启后考生从草稿恢复,没丢一道题——这个功能比任何花哨特效都管用。
源码里最值得抄的是随机抽题模块。从题库表里按`WHERE type='单选' ORDER BY RAND() LIMIT 20`这样取题,简单粗暴但够用。如果题库上万道,RAND()会拖慢查询,可以改成先取ID范围再随机偏移量,但一般学校机房这种量级根本用不上。
安全方面得防SQL注入。所有参数用PDO预处理绑定,别图省事拼字符串。登录验证码用PHP的`gd`库画个四位数字,干扰线画三道就够。有次看到网上某源码直接用`$_SESSION['code'] = $_POST['code']`,那等于没验证——至少得用`strtolower`统一大小写再比对。
导出成绩单用PHPExcel库,但新版PHP得用PhpSpreadsheet。其实纯用`fputcsv`输出CSV文件也行,Excel打开自动识别中文编码,记得加`header('Content-Type: text/csv; charset=utf-8')`和BOM头。我见过有人卡在这地方,导出全是乱码,最后发现缺了`\xEF\xBB\xBF`。
那套源码还在GitHub上挂着,搜"php-exam-system"能找到。核心文件就六个:`config.php`(数据库连接)、`login.php`、`exam.php`、`admin_question.php`、`admin_result.php`、`logout.php`。加起来不到两千行,注释写得不全,但逻辑清楚。真遇到问题,直接改数据库字段比改代码快——比如想加填空题,只需在`type`字段加个枚举值,再在判分函数里多写一个`case`分支。
用PHP写这套系统的真实感受是:它不优雅,但皮实。就像食堂大锅菜,味道谈不上惊艳,可每天都能准时出餐,管饱。你要是追求高并发、分布式、微服务,请绕道。但要是只想让几十个学生同时在线考试不崩,PHP这套源码够你折腾五年。