本文所介绍的应用程序是以ASP编程的初学者为读者的。虽然这个例子非常简单,但是它对于那些试图在线对他们的雇员、学生或客户进行考试的组织是非常有用的。
关于这个应用程序
我们的应用程序中的第一个界面包含在index.asp 中,由一个注册页组成,其中有两个输入域,一个是用户名,另一个是口令。非会员要想参加考试的话必须要注册。这一页是初始屏幕,为用户提供用户名和口令的输入框。
需要注意的是,这两个将要批准的会员域应该有客户机端的JavaScript 确认,以便不把它们作为空白域来传递。
if (theForm.username.value == "")
{
alert("Please enter the \"User Name\"");
theForm.username.focus();
return (false);
}
if (theForm.password.value == "")
{
alert("Please enter the \"Password\"");
theForm.password.focus();
return (false);
}
创建这些域的HTML代码如下:
< table border="0" cellpadding="0" >
< tr >
< td width="50%" >
< font face="Verdana" size="2" >User Name : < /font >
< /td >
< td width="50%" >
< font face="Verdana" size="2" >< input type=text name=username
size=20 maxlength=50 >< /font >
< /td >
< /tr >
< tr >
< td width="50%" >
< font face="Verdana" size="2" >Password :< /font >
< /td >
< td width="50%" >
< font face="Vedana" size=2 >< input type=password name=password
size=20 maxlength= 50 >< /font >
< /td >
< /tr >
< tr >
< td width="100%" colspan="2" align="center" >
< font face="Verdana" size="2" >< br > < input type="submit" value="Submit" name="B3" >
< input type="reset" value="Reset" name="B4" >
< /font >
< /td >
< /tr >
< /table >
要注意这个ASP页多多少少是一个HTML页面,作为ASP页的原因是要显示错误信息,例如“错误的用户名或口令或选择一个新用户名”,或者是需要显示的其它任何信息。注册表单中包含一些个人信息,如姓名、Email 、口令等。同样可以从访问者得到关于年龄、教育程度、职业等方面的信息。一旦成功的输入了个人信息,访问者就成为一名会员,可以使用站点的其它部分了。根据应用程序的设计要求,这些域可以是必须输入的,也可以不是。
登录代码Register.asp
当一个新的访问者注册了一个在线考试时就显示这一页。它可能会要求大量的个人信息,但是在本例中只要求姓名、Email 和口令。表单提交后,用户被引领至sendregister.asp。
Sendregister.asp
这一页从register.asp 中取得表单域的内容,将它们插入数据库中。要注意用户名必须是唯一的。所以,首先查询要验证输入的用户名是否已经存在。如果是的话,用户被重新引回register.asp 页,并被要求选择另一个用户名。如果用户名是新的,输入的内容就被传递给数据库。
sql_findmember = "select count(*) from loginuser where username = " & username &""
Set RS_findmember = Application("Conn").Execute(sql_findmember)
If RS_findmember(0) < > 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(" & username & "," & useremail & ", " & pwd &") "
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"),"","")
Checkuser.asp
在应用程序的开始,访问者键入了他们的口令之后,他们的细节被指向了一页,如sendregister.asp,来检验一下具体的用户名和口令在数据库中是否存在。
sql_check = "select count(*) from loginuser where username =" & _
username &" and password = " & useremail &""
Set RS_check = Application("Conn").Execute(sql_check)
If RS_check(0) < > 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"),"","")
选择一个测验Default.asp
一旦成功登录,就出现第二个界面,提供会员可以选择的测验科目的列表。在本例中,我们有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);" >
< option value="0" >Select the examination
< %Do while not RS_papers.EOF% >
< option value="< %=RS_papers("id")% >" >< %=lcase(RS_papers("topic"))% >< /OPTION >
< %
RS_papers.MoveNext
Loop
% >
msec函数在X值的基础上调用 redirect.asp,把查询字符串: ?x 的值作为下拉菜单中被选择的项的值。
function msec(x)
{if (x==0)
{ alert("Please select any one of the Examinations")
}
else
{ location. f="redirect.asp?section=" + x
}
}
Redirect.asp
这一页将用户送到实际生成题目和选项的ASP页。如果数据库中没有所选择的特定主题的任何题目,就显示错误信息和返回连接。
首先:
id = Request.QueryString ("section")
调用查询字符串部分,将值存入变量 id中。
然后:
SQL = "select tbl_name from paper where id="&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 " & MyString(1) & Test is still to be launched. Come back _
later < a href=default.asp >BACK< /a >"
Else
Response.Redirect ("exam.asp?section="&id )
End If
如果以上查询产生了结果,就表示会员所选择的科目中有题目,可以进行在线考试。如果特定部分还在创建中,就告诉访问者稍后再回来进行考试。这是主考者的特殊兴趣,因为会员能够知道在前面的屏幕上下拉菜单所提供的科目哪些是悬而未决的。这样,如果这个部分有题目和相应的选项,这一页就被重新引导到exam.asp 页,其中包含着实际的题目。
测验代码
Exam.asp 提供一系列的题目和以单选按钮为格式的选项。为了使测验更具挑战性,还要有时间限制。我设置了一个装载时自动启动的时钟,将其时间设为20秒。剩余的时间在屏幕底部的状态窗口中显示。时间因素同题目个数一样可以改变。为了在每次会员想要参加考试时,都从数据库中选择不同的题目,我使用了随机函数。在数据库中,题目的个数固定为10个,每次会员回答5个问题。所有的题目都一起显示出来,然后开始计时。以下代码是计时器的函数:
< script language="JavaScript" >
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";
}
< /script >
要注意,没有时间限制的测验是没有乐趣的。
这页的查询是这样的:
id = Request.QueryString ("section")
session("id") = id
sql_tblname = "select tbl_name from paper where id="&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, " &_
" a.choice4 from " & subject & " a where a.id="&MyArray(Counter)
在这个查询中,