一个在线考试系统,最核心的环节无非就是登录、答题和出分。下面这份基于 ASP + Access 的代码,把这三个步骤拆得清清楚楚,逻辑非常直白——对于刚接触 Web 开发的朋友来说,是很好的练手素材。
login.asp
登录页负责接收考生的用户名和密码,然后去数据库里比对身份。代码先判断输入框是否为空,接着连上数据库,用一条动态拼接的 SQL 语句去查询用户表。
' 考生验证.
<%@ Language=VBScript %>
<%
name=trim(request("name"))
passwd=trim(request("passwd"))
if name<>"" and passwd<>"" then
' 检查考生是否输入用户名和密码.
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver(*.mdb)};dbq=" & Server.MapPat("exercise.mdb")
set rs= server.createobject("adodb.recordset")
sql= "select * from user where user='" &name& "' and passwd='" & passwd & "'"
Set rs= conn.Execute(sql)
' 验证考生合法性.
if not(rs.eof) then
if rs("score")<>0 then
' 检查考生是否已参加过考试,若是则进行成绩查询.
response.write rs("user")&"的考试成绩是"&rs("score")
else
session("pass")=1
session("user")=name
response.redirect "test.asp"
end if
else
Response.Write "噢,您输入的用户名或密码不正确!"
end if
else
end if
%>
撼雪喷云之考生登录
这里用了最简单直接的字符串拼接来构造 SQL,虽然演示方便,但实际项目中一定要警惕 SQL 注入风险。另外,如果考生之前考过(成绩字段不为 0),页面会直接显示历史分数,避免重复考试。
test.asp
考试页的第一步是验证会话——没登录的人会被强制跳回 login.asp。通过验证后,从题库表(test)里拉取所有试题,一件件展示出来,每道题四个选项用单选按钮呈现。页面顶部的时钟用了 Ja vaScript 的setTimeout做实时刷新,算是个轻量计时器。
' 从题库中取题考试.
<%@ Language=VBScript %>
<%
if session("pass")<>1 then
response.redirect "login.asp"
else
end if
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("exercise.mdb")
sql="select * from test"
Set rs = conn.Execute( sql )
' 提取试题.
%>
' 以上是一个计时函数.
' 调用计时函数显示时间.
Time Hour Min Sec
试题的序号通过循环变量i动态生成,每个答案框的 name 属性是 ans1、ans2……这样在结果页就可以按顺序拿到所有选项。注意这里的do while not rs.eof循环,把题库里所有题目一次性全显示出来,题量大的话页面会很长,但逻辑上很清晰。
result.asp
交卷后跳转到结果页。这里先取出标准答案(从 test 表的 ans 字段),然后通过Request.Form逐题比较考生答案,累加正确数,最后算出百分制分数。分数低于 60 给一句安慰,超过 60 说“及格”,满分则恭喜。成绩最终写回用户表。
' 评分并将成绩记录到数据库.
<%@ Language=VBScript %>
<%
name=session("user")
dim score
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver(*.mdb)};dbq=" & Server.MapPath("exercise.mdb")
sql="select ans from test"
Set rs = conn.Execute( sql )
ycorrect=0
rsCount=0
Response.Write "标准答案:"
' 给出标准答案并评分.
Do while not rs.eof
Response.Write rs("ans")
rsCount=rsCount+1
if Request.Form(rsCount)=rs("ans") then
ycorrect=ycorrect+1
end if
rs.movenext
loop
Response.Write "
您的答案:"
score=int(ycorrect/rscount*100)
for i=1 to Request.Form.Count-1
Response.Write Request.Form(i)
next
Response.Write "
"
Response.Write "您的成绩:"&score
if score<60 then Response.Write "别难过,您不及格!"&"
"
else if score>=60 Response.Write "幸好,您及格了!"&"
"
else Response.Write "恭喜,您获得了优秀!"
strSql="insert into user (result) values ("&score&") where user='"&name&"'"
conn.execute(strSql)
' 将成绩存到数据库.
%>
这个版本的成绩存储用了 INSERT 语句加上 WHERE 条件——严格来说应该用 UPDATE 来更新已有记录,但这里的设计意图很明显:如果考生是第一次考试,则插入一条新记录(不过前提是用户表里已经有该考生的基本信息,否则会失败)。从代码的注释里能看出,整个流程都围绕着“一个用户只能考一次”的约束来设计,思路很传统,但对于小型练习系统来说完全够用。
整体来看,这三个页面构成了一个完整的在线测试闭环,结构简单、代码好读,适合作为初学者理解 ASP 数据库编程的参考。
本文转载于:https://www.jb51.net/article/4794.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。
同类商品