1. 技术基础
也许这个问题你已经知道答案,但它的的确确困扰了我,以至于觉得实现考试系统是个麻烦事。这个问题是:后端如何获得学生的答案选项?
所有题目都是在一个<form>里,每个选项对应一个<input>,题目不同,<input>的name属性就不同,有多少个input就应该有多少个name属性。后端怎么知道有多少个input,如何枚举这些input的name属性值呢?
答案在下面,input name数组。
<?php
echo var_dump($_GET['choice']);
echo "<hr>";
echo json_encode($_GET['choice']);
echo "<hr>";
$ch = $_GET['choice'];
foreach($ch as $k => $v)
{
echo $k . "=>" . $v;
}
?><form action="test.php" id="form1" name="form1" method="get">
<input type="text" name="choice[1]" value="A" />
<input type="text" name="choice[2]" value="B" />
<input type="text" name="choice[3]" value="C" />
<input type="text" name="choice[99]" value="D" />
<input type="text" name="choice[99][title]" value="Manager" />
<input type="text" name="choice[99][salary]" value="100" />
<input type="submit" type="text" name="submit" />
</form>
输出结果:
还有两个很重要、很方便的函数:serialize、unserialize
多项选择的思路:
$ch = $_GET['choice'];
foreach($ch[100] as $o)
{
echo $o;
}
<input type="checkbox" name="choice[100][0]" value="A" />
<input type="checkbox" name="choice[100][1]" value="B" checked />
<input type="checkbox" name="choice[100][2]" value="C" />
选中A,则输出A
选中B、C,则输出B、C
2. 数据设计
有了上面的基础后,数据设计就方便多了。
choice表: | |
choice_id | 选项id |
title | 题干 |
body | 选项(数组序列化存储) |
answer | 答案(数组序列化存储) |
explain | 答案解析 |
exam表: | |
exam_id | 试卷编号 |
choice_id | 题目编号 |
exam_session表: | |
user_id | 用户id |
exam_id | 试卷编号 |
mark | 试卷得分 |
exam_detail表 | |
user_id | 用户id |
exam_id | 试卷编号 |
choice_id | 题目编号 |
user_answer | 用户答案 |
3. 代码架构设计
场景1:题目录入。这个比较简单,就是一道道的题目录入,录一个进一个题库。
场景2:组卷。列出所有题目,每个题目前面一个复选框,选中若干题,然后提交即可。参考phpmyadmin
场景3:做题。选择一张试卷,查询出所有题目,然后输出。用户做题后提交。后端获得question题目编号、答案key-value对,计算答案正确与否。
场景4:勘误。将答案显示给用户,并标出对错。
场景5:查看历史试题。每次提交的试题都有历史记录,都可以在后台查看到。
4. 参考内容
一个非常不错的开源考试平台,php+mysql架构:http://www.phpems.net/