在线考试系统设计与实现精要

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>
输出结果:


还有两个很重要、很方便的函数:serializeunserialize


多项选择的思路:

$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/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值