找回密码
 入学

QQ登录

只需一步,快速开始

查看: 1453|回复: 7

用ASP开发一个在线考试程序(三)

[复制链接]
发表于 2004-10-21 17:48:50 | 显示全部楼层 |阅读模式
<B>Sendregister.asp</B>
  这一页从register.asp 中取得表单域的内容,将它们插入数据库中。要注意用户名必须是唯一的。所以,首先查询要验证输入的用户名是否已经存在。如果是的话,用户被重新引回register.asp 页,并被要求选择另一个用户名。如果用户名是新的,输入的内容就被传递给数据库。
sql_findmember = "select count(*) from loginuser where username = " &amp; username &amp;""
Set RS_findmember = Application("Conn").Execute(sql_findmember)
If RS_findmember(0) &lt; &gt; 0 Then
Session("message") = "THE ENTRY HAD BEEN INSERTED EARLIER .. Please try another log in name"
response.redirect "register.asp"
End If
If RS_findmember(0) = 0 Then
sql_insert = "insert into loginuser (username,useremail,password) _
values(" &amp; username &amp; "," &amp; useremail &amp; ", " &amp; pwd &amp;") "
Set RS_insert = Application("Conn").Execute(sql_insert)
Session("message") = "THE ENTRY HAS BEEN INSERTED .. Thank You"
response.redirect "index.asp"
End If
  这样,如果RS_findmember(0) 返回的值是0,就表示用户名在数据库中不存在,名字就被输入了。会员就可以使用站点的其它部分了。反之,如果RS_findmember(0) 返回的值大于0,用户就被引导回注册主页,并被要求填写一个新的用户名。
  还要注意,在向数据库中插入数据之前有一些事情需要警惕。替换函数用来确保当访问者键入了"",就需要用代替。
username = replace(request.form("txt_name"),"","")

 楼主| 发表于 2004-10-21 17:49:37 | 显示全部楼层
<>用ASP开发一个在线考试程序(四)</P><>b&gt;Checkuser.asp</B>
  在应用程序的开始,访问者键入了他们的口令之后,他们的细节被指向了一页,如sendregister.asp,来检验一下具体的用户名和口令在数据库中是否存在。
sql_check = "select count(*) from loginuser where username =" &amp; _
username &amp;" and password = " &amp; useremail &amp;""
Set RS_check = Application("Conn").Execute(sql_check)
If RS_check(0) &lt; &gt; 0 Then
Session("username") = request.form("username")
response.redirect "default.asp"
End If
If RS_check(0) = 0 Then
Session("error") = "WRONG USER NAME OR PASSWORD"
response.redirect "index.asp"
End If
  sql命令检查一个特定的用户是否已经注册了。如果返回值为0,就表明用户名或email 无效,将用户引导回注册页。如果是会员,就被引导到default.asp 页。这一次又用到了替换函数,以保证如果会员键入了‘ (单引号),就要用 (双引号)来替换。
username = replace(request.form("username"),"","")
useremail = replace(request.form("password"),"","")
<B>选择一个测验</B>
<B>Default.asp</B>
  一旦成功登录,就出现第二个界面,提供会员可以选择的测验科目的列表。在本例中,我们有HTML 和DHTML ,当然可以增加表格以提高主题数。Default.asp 要求表格安装一个下拉菜单,其中包含主题的列表。查询数据库,从试卷的表格中搜集两个域。
sql_papers = "select *id, topic from paper sort order by topic asc"
SET RS_papers = Application("Conn").Execute(sql_papers)
  为了在下拉菜单中显示结果,使用以下代码:
SELECT size=1 name=select1 onchange="msec(document.form1._
select1.options[document.form1.select1.selectedIndex].value);" &gt;
&lt; option value="0" &gt;Select the examination
&lt; %Do while not RS_papers.EOF% &gt;
&lt; option value="&lt; %=RS_papers("id")% &gt;" &gt;&lt; %=lcase(RS_papers("topic"))% &gt;&lt; /OPTION &gt;
&lt; %
RS_papers.MoveNext
Loop
% &gt;
  msec函数在X值的基础上调用 redirect.asp,把查询字符串: ?x 的值作为下拉菜单中被选择的项的值。
function msec(x)
{if (x==0)
{ alert("lease select any one of the Examinations")
}
else
{ location. f="redirect.asp?section=" + x
}
}
</P>
回复

使用道具 举报

 楼主| 发表于 2004-10-21 17:50:13 | 显示全部楼层
<>用ASP开发一个在线考试程序(五)</P><><B>Redirect.asp</B>
  这一页将用户送到实际生成题目和选项的ASP页。如果数据库中没有所选择的特定主题的任何题目,就显示错误信息和返回连接。
首先:
id = Request.QueryString ("section")
调用查询字符串部分,将值存入变量 id中。
然后:
SQL = "select tbl_name from paper where id="&amp;id
Set RS = Application("Conn").Execute(SQL)
subject= RS(0)
MyString = Split(subject,"tbl",-1,1)
  SQL声明传递试卷表格中的域名 table_name 。结果存储在subject中。进一步分离变量subject,将其存储在MyString中。Split 函数用来在客户端显示测验名,是为了看起来效果更好。
IF RS_subject.BOF AND RS_subject.EOF Then
Response.Write Online " &amp; MyString(1) &amp; Test is still to be launched. Come back _
later &lt; a href=default.asp &gt;BACK&lt; /a &gt;"
Else
Response.Redirect ("exam.asp?section="&amp;id )
End If
  如果以上查询产生了结果,就表示会员所选择的科目中有题目,可以进行在线考试。如果特定部分还在创建中,就告诉访问者稍后再回来进行考试。这是主考者的特殊兴趣,因为会员能够知道在前面的屏幕上下拉菜单所提供的科目哪些是悬而未决的。这样,如果这个部分有题目和相应的选项,这一页就被重新引导到exam.asp 页,其中包含着实际的题目。
</P>
回复

使用道具 举报

 楼主| 发表于 2004-10-21 17:51:15 | 显示全部楼层
<></P><>用ASP开发一个在线考试程序(六)</P><><B>测验代码</B>
  Exam.asp 提供一系列的题目和以单选按钮为格式的选项。为了使测验更具挑战性,还要有时间限制。我设置了一个装载时自动启动的时钟,将其时间设为20秒。剩余的时间在屏幕底部的状态窗口中显示。时间因素同题目个数一样可以改变。为了在每次会员想要参加考试时,都从数据库中选择不同的题目,我使用了随机函数。在数据库中,题目的个数固定为10个,每次会员回答5个问题。所有的题目都一起显示出来,然后开始计时。以下代码是计时器的函数:
&lt; script language="JavaScript" &gt;
var ck=0;
var tf=0;
var timeUp=0;
var timeLeft=0;
var tcount=0;
TimerFunc();
function TimerFunc() {
tf=window.setTimeout("TimerFunc();",1000);
tcount++;
timeLeft=20 - tcount;
window.status = timeLeft + " Seconds remaining";
}
&lt; /script &gt;
  要注意,没有时间限制的测验是没有乐趣的。
这页的查询是这样的:
id = Request.QueryString ("section")
session("id") = id
sql_tblname = "select tbl_name from paper where id="&amp;id
Set RS_tblname = Application("Conn").Execute(sql_tblname)
subject= RS_tblname(0)
MyString = Split(subject,"tbl",-1,1)
  查询字符串存储在一个 session("id")中, 按顺序启动查询。这个SQL声明的目的是从试卷表格中找到表格名。使用split 函数的目的是从结果中去掉tbl。(我使用了表格名前加tbl前缀的命名惯例)。一旦找到了表格名,就开始了向指定表格的查询。为了使应用程序更有意思,我使用了随机函数,生成从1到10之间的任意数字。这些数字用来从指定的科目表格中选取id:
sql_details = "select a.id, a.question, a.choice1, a.choice2,a.choice3, " &amp;_
" a.choice4 from " &amp; subject &amp; " a where a.id="&amp;MyArray(Counter)
  在这个查询中,id,question、 choice1、 choice2、 choice3、 choice4 都是科目表格中的域名。
MyArray(Counter) 是已经生成的随机数字。

  测验结束后,结果被存储起来并被增加到数据库的细节表格中。这样会员就能看到测验的结果了。(在本例中,我只保留了科目的一个记录和百分制的分数。还可以有一个时间-日期标志。)
<B>记录结果</B> </P>
回复

使用道具 举报

 楼主| 发表于 2004-10-21 17:51:56 | 显示全部楼层
<>用ASP开发一个在线考试程序(七)</P><><B>Result.asp</B>
  这一页的主要目的是显示结果,同时将这些结果插入数据库以备将来参考。
for each item in Request.Form
sql_check = "select Count(*) from "&amp;subject&amp;" where answer =" &amp; Request.Form(item) &amp; ""
Set RS_check = Application("Conn").Execute(sql_check)
if RS_check(0) &gt; 0 then
result = result + 1
end if
next
  变量result中存储了结果。
  百分数是从result中算出来的,如下所示:
percent = round(( 100 * result )/count)
  要将这个结果存储在数据库中,执行以下查询:
sql_id = "select id from loginuser where username=" &amp; Session("username") &amp;""
Set RS_id = Application("Conn").Execute(sql_id)
id= RS_id(0)
SQL_insert = "insert into details (ref_id,subject,score) values(" &amp; id &amp; "," _
&amp; subject &amp; ", " &amp; percent &amp;") "
Set RS_insert = Application("Conn").Execute(SQL_insert)
<B>View.asp</B>
  观看模块检查会员是否以前曾经进行过在线考试。如果是的话,将用户引导到viewrecord.asp。如果没有的话,显示相应的信息。
sql_id= "select id from loginuser where username=" &amp; Session("username") &amp;""
Set RS_id = Application("Conn").Execute(sql_id)
id= RS_id(0)
sql_count = "Select count(*) from details where ref_id = " &amp; id &amp;""
Set RS_count = Application("Conn").Execute(sql_count)
If RS_count(0) &lt; &gt; 0 Then
response.redirect "viewrecord.asp"
End If
If RS_count(0) = 0 Then
Session("noview") = "NO ONLINE EXAMINATIONS HAVE BEEN GIVEN"
response.redirect "default.asp"
End If
<B>Viewrecord.asp</B>
  Viewrecord.asp页使会员能够观看一些他们的细节信息。查询如下:
sql_details = "Select *subject, score from details where ref_id = " &amp; id &amp;""
Set RS_details = Application("Conn").Execute(sql_details)
结果是用一个简单的表格格式来显示的。

  请注意,我并没有将会员可以进行一个主题的考试次数限制为一次。同一个主题考试可以进行任意次。
</P>
回复

使用道具 举报

 楼主| 发表于 2004-10-21 17:52:52 | 显示全部楼层
<>用ASP开发一个在线考试程序(八)</P><>b&gt;数据库结构</B>

  我将数据库命名为onlinetest.mdb。数据库中的表格数取决于主题或科目数。现在我们总共有5个表格:
● loginuser
● paper
● details
● tblHTML
● tblDHTML
<B>loginuser表结构 </B>
字段名数据类型描述IdAuto Number主关键字UsernameText成员名字UseremailText成员的电子邮件地址PasswordText成员的口令
<B>details 表结构</B>
字段名数据类型描述IdAuto Number主关键字Ref_idText成员的参考ID号SubjectText成员选择的主题ScoreText成员得分结果
<B>paper 表结构</B>
字段名数据类型描述IdAuto Number主关键字TopicText在线测验所要覆盖的部分/主题列表Tbl_nameText包含指定主题的相关表格名
<B>tblHTML 表结构</B>
字段名数据类型描? th&gt; IdAuto Number主关键字Question Text要显示的题目Choice1Text供选择的答案Choice2Text供选择的答案Choice3Text供选择的答案Choice4Text供选择的答案AnswerText正确答案
  同样,tblDHTML 与 tblHTML 定义的方式相同。
  我给每个科目都创建了单独的表格,在本例中一个是为HTML,另一个是为 DHTML。要想进一步增加新表格或扩展现有表格也都很容易。
</P>
回复

使用道具 举报

 楼主| 发表于 2004-10-21 17:54:33 | 显示全部楼层
<>用ASP开发一个在线考试程序(九)</P><><B>数据库的连接</B>
  为了运行这个应用程序我使用了global.asa 。运行global.asa 文件的细节在以前的文章- Using Global.asa Correctly 有详细描述。
&lt; SCRIPT LANGUAGE=VBScript RUNAT=Server &gt;
Sub Application_OnStart
dbPath = "DBQ=" &amp; Server.Mappath("onlinetest.mdb")
dbConnectionString = "DRIVER={Microsoft Access Driver (*.mdb)}; " &amp; dbPath
Set Application("Conn") = Server.CreateObject ("ADODB.Connection")
Application("Conn").Open dbConnectionString
End Sub
Sub Application_OnEnd
Application("Conn").Close
Set Application("Conn") = Nothing
End Sub
Sub Session_OnStart
End Sub
Sub Session_OnEnd
End Sub
&lt; /SCRIPT &gt;
<B>结论</B>
  这个应用程序非常简单,但是对于那些想要有在线考试的站点却是非常有用的。那些在特殊领域有特殊用途的公司也可以使用它,参考者及他们的详细信息可以从表格中恢复。读者也许还想进一步探讨以增强此应用程序的功能:
● 一次只显示一个题目。
● 可以从难到易预先设定题目模式。
点击此处下载本文相关资料。 </P>
回复

使用道具 举报

发表于 2005-1-5 20:30:13 | 显示全部楼层
<>dbPath = "DBQ=" &amp; Server.Mappath("onlinetest.mdb")
dbConnectionString = "DRIVER={Microsoft Access Driver (*.mdb)}; " &amp; dbPath</P><>这个执行效率是不没有直接调用快啊</P><>set conn = Server.CreateObject("ADODB.Connection")
connstr="rovider=Microsoft.Jet.OLEDB.4.0;Data Source=" &amp; Server.MapPath(dbpath)
请问,楼上的是谁?</P>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 入学

本版积分规则

QQ|Archiver|手机版|小黑屋|校园天空成立于2004年2月24日 ( 陕ICP备08000078号-8 )

GMT+8, 2025-5-11 11:35 , Processed in 0.109540 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表