日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

用ASP開發(fā)一個在線考試系統(tǒng)

 悟靜 2010-05-02

  本文所介紹的應(yīng)用程序是以ASP編程的初學者為讀者的。雖然這個例子非常簡單,但是它對于那些試圖在線對他們的雇員、學生或客戶進行考試的組織是非常有用的。

  關(guān)于這個應(yīng)用程序

  我們的應(yīng)用程序中的第一個界面包含在index.asp 中,由一個注冊頁組成,其中有兩個輸入域,一個是用戶名,另一個是口令。非會員要想?yún)⒓涌荚嚨脑挶仨氁浴_@一頁是初始屏幕,為用戶提供用戶名和口令的輸入框。

  需要注意的是,這兩個將要批準的會員域應(yīng)該有客戶機端的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);
}

  創(chuàng)建這些域的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 、口令等。同樣可以從訪問者得到關(guān)于年齡、教育程度、職業(yè)等方面的信息。一旦成功的輸入了個人信息,訪問者就成為一名會員,可以使用站點的其它部分了。根據(jù)應(yīng)用程序的設(shè)計要求,這些域可以是必須輸入的,也可以不是。

  登錄代碼Register.asp

  當一個新的訪問者注冊了一個在線考試時就顯示這一頁。它可能會要求大量的個人信息,但是在本例中只要求姓名、Email 和口令。表單提交后,用戶被引領(lǐng)至sendregister.asp。

  Sendregister.asp

  這一頁從register.asp 中取得表單域的內(nèi)容,將它們插入數(shù)據(jù)庫中。要注意用戶名必須是唯一的。所以,首先查詢要驗證輸入的用戶名是否已經(jīng)存在。如果是的話,用戶被重新引回register.asp 頁,并被要求選擇另一個用戶名。如果用戶名是新的,輸入的內(nèi)容就被傳遞給數(shù)據(jù)庫。
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,就表示用戶名在數(shù)據(jù)庫中不存在,名字就被輸入了。會員就可以使用站點的其它部分了。反之,如果RS_findmember(0) 返回的值大于0,用戶就被引導回注冊主頁,并被要求填寫一個新的用戶名。

  還要注意,在向數(shù)據(jù)庫中插入數(shù)據(jù)之前有一些事情需要警惕。替換函數(shù)用來確保當訪問者鍵入了"",就需要用代替。

username = replace(request.form("txt_name"),"","")


  Checkuser.asp

  在應(yīng)用程序的開始,訪問者鍵入了他們的口令之后,他們的細節(jié)被指向了一頁,如sendregister.asp,來檢驗一下具體的用戶名和口令在數(shù)據(jù)庫中是否存在。
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命令檢查一個特定的用戶是否已經(jīng)注冊了。如果返回值為0,就表明用戶名或email 無效,將用戶引導回注冊頁。如果是會員,就被引導到default.asp 頁。這一次又用到了替換函數(shù),以保證如果會員鍵入了‘ (單引號),就要用 (雙引號)來替換。
username = replace(request.form("username"),"","")
useremail = replace(request.form("password"),"","")

  選擇一個測驗Default.asp

  一旦成功登錄,就出現(xiàn)第二個界面,提供會員可以選擇的測驗科目的列表。在本例中,我們有HTML 和DHTML ,當然可以增加表格以提高主題數(shù)。Default.asp 要求表格安裝一個下拉菜單,其中包含主題的列表。查詢數(shù)據(jù)庫,從試卷的表格中搜集兩個域。

sql_papers = "select *id, topic from paper sort order by topic asc"
SET RS_papers = Application("Conn").Execute(sql_papers)

  為了在下拉菜單中顯示結(jié)果,使用以下代碼:

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函數(shù)在X值的基礎(chǔ)上調(diào)用 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頁。如果數(shù)據(jù)庫中沒有所選擇的特定主題的任何題目,就顯示錯誤信息和返回連接。
首先:
id = Request.QueryString ("section")
調(diào)用查詢字符串部分,將值存入變量 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 。結(jié)果存儲在subject中。進一步分離變量subject,將其存儲在MyString中。Split 函數(shù)用來在客戶端顯示測驗名,是為了看起來效果更好。
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
  如果以上查詢產(chǎn)生了結(jié)果,就表示會員所選擇的科目中有題目,可以進行在線考試。如果特定部分還在創(chuàng)建中,就告訴訪問者稍后再回來進行考試。這是主考者的特殊興趣,因為會員能夠知道在前面的屏幕上下拉菜單所提供的科目哪些是懸而未決的。這樣,如果這個部分有題目和相應(yīng)的選項,這一頁就被重新引導到exam.asp 頁,其中包含著實際的題目。

  測驗代碼

  Exam.asp 提供一系列的題目和以單選按鈕為格式的選項。為了使測驗更具挑戰(zhàn)性,還要有時間限制。我設(shè)置了一個裝載時自動啟動的時鐘,將其時間設(shè)為20秒。剩余的時間在屏幕底部的狀態(tài)窗口中顯示。時間因素同題目個數(shù)一樣可以改變。為了在每次會員想要參加考試時,都從數(shù)據(jù)庫中選擇不同的題目,我使用了隨機函數(shù)。在數(shù)據(jù)庫中,題目的個數(shù)固定為10個,每次會員回答5個問題。所有的題目都一起顯示出來,然后開始計時。以下代碼是計時器的函數(shù):
< 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 函數(shù)的目的是從結(jié)果中去掉tbl。(我使用了表格名前加tbl前綴的命名慣例)。一旦找到了表格名,就開始了向指定表格的查詢。為了使應(yīng)用程序更有意思,我使用了隨機函數(shù),生成從1到10之間的任意數(shù)字。這些數(shù)字用來從指定的科目表格中選取id:
sql_details = "select a.id, a.question, a.choice1, a.choice2,a.choice3, " &_
" a.choice4 from " & subject & " a where a.id="&MyArray(Counter)
  在這個查詢中,id,question、 choice1、 choice2、 choice3、 choice4 都是科目表格中的域名。
MyArray(Counter) 是已經(jīng)生成的隨機數(shù)字。


  測驗結(jié)束后,結(jié)果被存儲起來并被增加到數(shù)據(jù)庫的細節(jié)表格中。這樣會員就能看到測驗的結(jié)果了。(在本例中,我只保留了科目的一個記錄和百分制的分數(shù)。還可以有一個時間-日期標志。)

  記錄結(jié)果Result.asp

  這一頁的主要目的是顯示結(jié)果,同時將這些結(jié)果插入數(shù)據(jù)庫以備將來參考。
for each item in Request.Form
sql_check = "select Count(*) from "&subject&" where answer =" & Request.Form(item) & ""
Set RS_check = Application("Conn").Execute(sql_check)
if RS_check(0) > 0 then
result = result + 1
end if
next
  變量result中存儲了結(jié)果。
  百分數(shù)是從result中算出來的,如下所示:
percent = round(( 100 * result )/count)
  要將這個結(jié)果存儲在數(shù)據(jù)庫中,執(zhí)行以下查詢:
sql_id = "select id from loginuser where username=" & Session("username") &""
Set RS_id = Application("Conn").Execute(sql_id)
id= RS_id(0)
SQL_insert = "insert into details (ref_id,subject,score) values(" & id & "," _
& subject & ", " & percent &") "
Set RS_insert = Application("Conn").Execute(SQL_insert)

  View.asp

  觀看模塊檢查會員是否以前曾經(jīng)進行過在線考試。如果是的話,將用戶引導到viewrecord.asp。如果沒有的話,顯示相應(yīng)的信息。
sql_id= "select id from loginuser where username=" & Session("username") &""
Set RS_id = Application("Conn").Execute(sql_id)
id= RS_id(0)
sql_count = "Select count(*) from details where ref_id = " & id &""
Set RS_count = Application("Conn").Execute(sql_count)
If RS_count(0) < > 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

  Viewrecord.asp

  Viewrecord.asp頁使會員能夠觀看一些他們的細節(jié)信息。查詢?nèi)缦拢?br>sql_details = "Select *subject, score from details where ref_id = " & id &""

Set RS_details = Application("Conn").Execute(sql_details)
結(jié)果是用一個簡單的表格格式來顯示的。

  請注意,我并沒有將會員可以進行一個主題的考試次數(shù)限制為一次。同一個主題考試可以進行任意次。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多