?? 33333.txt
字號:
ASP網上考試系統源代碼
數據庫設計
首先建立一數據庫exercise.mdb,其中包括兩個表:user和test,user表中有包括三個字段:
字段名稱:user;字段類型:文本;字段大小:20。存儲用戶名
字段名稱:passwd;字段類型:文本;字段大?。?0。存儲用戶密碼
字段名稱:score;字段類型:數字;字段大?。赫?。存儲用戶成績
test表中有五個字段:
字段名稱:question;字段類型:文本;字段大?。?55。存儲考試題目
字段名稱:a;字段類型:文本;字段大小:100。存儲選項A的答案
字段名稱:b;字段類型:文本;字段大?。?00。存儲選項B的答案
字段名稱:c;字段類型:文本;字段大?。?00。存儲選項C的答案
字段名稱:d;字段類型:文本;字段大小:100。存儲選項D的答案
字段名稱:ans;字段類型:文本;字段大?。?。存儲正確答案
二.程序原代碼
下面是該系統中較核心的三段原程序,希望對開發類似系統的讀者取到拋磚引玉的作用,讀者也可對其進行改進以適應自己的系統。
‘Login.asp源程序,檢驗用戶是否合法
< %@ 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.MapPath("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 "對不起,
用戶或口令不正確?。。?quot;
end if
else
end if
% >
< HTML >
< HEAD >
< META NAME="GENERATOR"
Content="Microsoft Visual Studio 6.0" >
< TITLE >用戶口令檢查< /TITLE >
< /HEAD >
< BODY >
< FORM action="login.asp" id=FORM1
method=post name=FORM1 >
< P title="" > < /P >
< P title="" > < /P >
< P title="" align=center >用戶:
< INPUT id=text1 name=name
style="HEIGHT: 22px; WIDTH: 103px" >< /P >
< P title="" align=center >口令:
< INPUT id=password1 name=passwd
style="HEIGHT: 23px; WIDTH: 101px"
type=password >< /P >
< P title="" align=center >
< INPUT id=submit1 name=submit1
type=submit value=" 進入 " style="FONT-SIZE:
medium; FONT-STYLE: normal;
FONT-VARIANT: normal; FONT-WEIGHT:
bold" title="" >< /P >
< P title="" align=center >
< /P >
< /FORM >
< /BODY >
< /HTML >
‘test.asp源程序,從題庫中提取試題供解答
< %@ 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 )
% >
‘計時函數
< SCRIPT LANGUAGE="JavaScript" >
var isn1=null;
var isn2=false;
today=new Date();
function stopit(){
if(isn2){
clearTimeout(isn1);
}
isn2 = false;
}
function startit(){
stopit();
isnclock();
}
function isnclock(){
var now=new Date();
var hrs=now.getHours();
var min=now.getMinutes();
var sec=now.getSeconds();
document.clckh.disp.value=""+((hrs >12) ?
hrs-12 : hrs);
document.clckm.disp.value=((min< 10) ? "0" : "")+min;
document.clcks.disp.value=((sec< 10) ? "0" : "")+sec;
document.clck.disp.value=(hrs >=12) ? "p.m." : "a.m.";
isn1=setTimeout("isnclock()",1000);
isn2=true;
}
< /SCRIPT >
< HTML >
< HEAD >
< META NAME="GENERATOR"
Content="Microsoft Visual Studio 6.0" >
< /HEAD >
< BODY onLoad="startit()" BGCOLOR="FFFFFF" >
< center >
‘調用計時函數顯示時間
< TABLE BORDER=2 >
< TR >
< TD >Time< /TD >< TD >Hour< /TD >< TD >Min
< /TD >< TD >Sec< /TD >< TD >< /TD >
< /TR >
< TR >
< TD >< /TD >
< TD VALIGN=TOP >< FORM NAME="clckh" onSubmit="0" >
< INPUT TYPE="text" NAME="disp" SIZE=2 VALUE ="" >
< /FORM >< /TD >
< TD VALIGN=TOP >< FORM NAME="clckm" onSubmit="0" >
< INPUT TYPE="text" NAME="disp" SIZE=2 VALUE ="" >
< /FORM >< /TD >
< TD VALIGN=TOP >< FORM NAME="clcks" onSubmit="0" >
< INPUT TYPE="text" NAME="disp" SIZE=2 VALUE ="" >
< /FORM >< /TD >
< TD VALIGN=TOP >< FORM NAME="clck"
onSubmit="0" >
< INPUT TYPE="text" NAME="disp" SIZE=4 VALUE ="" >
< /FORM >< /TD >< /TR >
< /center >
‘顯示試題供解答
< FORM action="result.asp" id=FORM1
method=post name=FORM1 >
< P > < /P >
< P >
< %
i=1
rs.movefirst
do while not rs.eof% >
< P > < %=rs("question")% >< /P >
< TABLE align=center border=1 cellPadding=1
cellSpacing=1
width="80%" >
< TR >
< TD style="WIDTH: 50%" width="50%"
< INPUT name=ans< %=i% > type=radio value="A" >
< %=rs("a")% >< /TD >
< TD >< INPUT name=ans< %=i% >
type=radio value="B" >
< %=rs("b")% >< /TD >< /TR >
< TR >
< TD >< INPUT name=ans< %=i% >
type=radio value="C" >
< %=rs("c")% >< /TD >
< TD >< INPUT name=ans< %=i% >
type=radio value="D" >
< %=rs("d")% >< /TD >
< /TR >
< /TABLE >
< %
i=i+1
rs.movenext
loop
% >
< /P >
< P > < /P >
< P align=center >< INPUT id=submit1 name=submit1
type=submit
value=Submit >< INPUT id=reset1 name=reset1
type=reset value=Reset >< /P >< /FORM >
< /BODY >
< /HTML >
七、附錄:源程序列表
由于源代碼繁多,限于篇幅,無法一一列舉,現只公布部分代碼,具體以系統實物為準。下面是錄入試題.asp文件:
<script language="VBScript">
<!-- 'Written by HeKai 2001
Function datacheck()'確保前臺輸入數據合法
dim errflag, msg
errflag = True
if Len(Trim(luru.xzsj.value)) = 0 Then
focusto(1); errflag = false; msg="請輸入 '選自書籍名稱'"
ElseIf Len(Trim(luru.stnr.value)) = 0 Then
focusto(9); errflag = false; msg=" '試題內容' 呢"
ElseIf Len(Trim(luru.A.value)) = 0 Then
focusto(10); errflag = false; msg=" '答案_A' 呢"
┋ ┋ ┋
ElseIf Len(Trim(luru.F.value)) = 0 Then
focusto(15); errflag = false; msg="請還原成默認值"
End if
If (errflag = false) then
msg = msg & vbCRLF
MsgBox msg, 64, "提示"
Exit Function
End if
datacheck = errflag; luru.Submit
End Function
Sub focusto(x)'將鼠標定位在出錯處
document.luru.elements(x).focus()
End Sub
--></script>
以下是錄入試題.inc文件:
<script Language="VBScript" RunAt="Server">
Function check_Pass()'檢查庫中是否已有此數據
kmxxmc = Request.Form("kmxxmc")
stbh = Request.Form("stbh") stnr = Request.Form("stnr")
SQLstr = "select * from " & kmxxmc & " where stbh=" & "'" & stbh & "'"
SQLstr = SQLstr & " or tmnr=" & "'" & stnr & "'"
set adocon=Server.CreateObject("ADODB.Connection")
adocon.Open "zxtest"
set sa1=adocon.Execute(SQLstr)
If sa1.EOF Then
check_Pass = False
Else
check_Pass = True
End If
sa1.Close adocon.Close
End Function
Sub Add_Comment()'開始插入數據并顯示出來
Dim kmxxmc,xzsj,tmlx,nycd,jxyq,stbh,stnr
Dim A,B,C,D,E,F,bzda,lrz,Picstr,SQLstr,lr_date,zhang,jie
kmxxmc = Request.Form("kmxxmc") xzsj = Request.Form("xzsj")
┋ ┋ ┋
bzda = Request.Form("bzda") zhang = Request.form("zhang")
set adocon=Server.CreateObject("ADODB.Connection")
adocon.Open "zxtest"
SQLstr = "insert into " & kmxxmc & " (xzsj,tmlx,tmnd,jxyq,stbh,tmnr, bxda_a,"
SQLstr = SQLstr & ",jie,lrz) values (" & "'" & xzsj & "'," & "'" & tmlx & "',"
┋ ┋ ┋
SQLstr = SQLstr & "'," & "'" & date & "'," & "'" & zhang & "'," & "'" & jie & "'," SQLstr = SQLstr & "'" & lrz & "')"
set sa1 = adocon.Execute(SQLstr)
Picstr="<img src='/images/hekai.jpg'>"
Response.Write "恭喜!此為<i> " & lrz & "</i> 剛才錄入的試題"
Response.Write Picstr & " 試題編號:" & stbh
Response.Write "試題內容:" & stnr & "
"
Response.Write "答案_A:" & A & "
"
┋ ┋ ┋
adocon.Close
End Sub
Sub Register()
If check_Pass() Then '如果庫中已有的話,則給出提示信息
Show_Warning()
Else '否則添加進去
Add_Comment()
End If
End Sub
Sub Show_Warning()'給出提示信息的函數
Response.Write("<p>")
Response.Write("<center>很抱歉<p>")
Response.Write("庫中已有此試題編號或試題內容,請返回前頁修改!")
Response.Write("</center>")
Response.Write("Made by hekai himself in 2001")
End Sub
</script>
此為"檢索試題"的程序代碼:
<script Language="VBScript" RunAt="Server">
Function adjust_sql(adj_str)
'目的---轉換查詢字符串中的特殊字符至SQL指令
Dim final_str, i 'WRITE BY HEKAI2001
adj_str = Trim(adj_str)
final_str = "" '每次從傳進來的字符串中取出一個字符,并判斷是否為下述三個字符之一: DOS的Filter符號"|"、左中括號"["以及單引號"'"
If Len(adj_str) > 0 Then
For i = 1 To Len(adj_str)
Select Case Mid(adj_str, i, 1)
Case "[": final_str = final_str & "[[]"
Case "|": final_str = final_str & "[{-}]"
Case "'": final_str = final_str & "[&-()"
Case Else: '以上皆非則什么事都不做!
final_str = final_str & Mid(adj_str, i, 1)
End Select
Next
End If
adjust_sql = final_str
End Function
Sub Output_shiti()
Dim kmxxmc,xzsj,stbh,zhang,jie,tmlx,nycd,jxyq,lrz,stnr,cond_count, Picstr
Dim SQLstr,mf,zhangfw,jiefw,stbhfw,nycdfw,lr_datefw,lr_date
'記錄指定條件的欄位總數
cond_count = 10; mf = "%"
Picstr="<img src='/images/hk.gif'>"
'取得表單欄位內容
kmxxmc = Request.Form("kmxxmc")
stbh = Request.Form("stbh")
┋ ┋ ┋
stnr = Request.Form("stnr")
'調整SQL指令中的特定字元
kmxxmc = adjust_sql(kmxxmc)
stbh = adjust_sql(stbh)
┋ ┋ ┋
stnr = adjust_sql(stnr)
If Len(xzsj) = 0 Then cond_count = cond_count - 1
If Len(stbh) = 0 Then cond_count = cond_count - 1
┋ ┋ ┋
If Len(stnr) = 0 Then cond_count = cond_count - 1
SQLstr = "select * from " & kmxxmc & " where "
If Len(stbh) > 0 Then
SQLstr = SQLstr & " stbh " & stbhfw & "'" & stbh & "'"
If cond_count > 1 Then
SQLstr = SQLstr & " and "
cond_count = cond_count - 1
End If
End If
┋ ┋ ┋
If Len(stnr) > 0 Then
SQLstr = SQLstr & " tmnr like " & "'" & mf & stnr & mf & "'"
If cond_count > 1 Then
SQLstr = SQLstr & " and "
cond_count = cond_count - 1
End If
End If
SQLstr = SQLstr & " order by lr_date DESC "
set adocon=Server.CreateObject("ADODB.Connection")
adocon.Open "zxtest"
set sa1 = adocon.Execute(SQLstr)
If sa1.EOF Then
Response.Write "
<center><h1>"
Response.Write "Sorry!<p>"
Response.Write "沒有找到試題,"
esponse.Write "請重試一次?。?center><p>"
Response.Write "<hr></h1>"
Else
i = 0
Response.Write "<h2>"
Response.Write "符合條件的試題相關內容如下:"
Response.Write "</h2>"
While Not sa1.EOF
i = i + 1
Response.Write "第 <i>" & i & "</i>題 題編號:<i>" & sa1("stbh") & "</i>
"
Response.Write "試題內容:" & sa1("tmnr") & "
"
┋ ┋ ┋
Response.Write "答案A:" & sa1("bxda_a") & "
"
sa1.MoveNext
WEnd
adocon.Close
End If
End Sub
</script>
<% '"檢索試卷"的查詢方式源代碼
mf="%"
select case request("findfs")
case "sjbh"
sqlstr="SELECT * FROM tbsjxx WHERE " & " sjbh LIKE"
sqlstr=sqlstr & "'" & mf & request("findfsz") & mf & "'order by ksrq DESC"
┋ ┋ ┋
case "lr_date"
sqlstr="SELECT * FROM tbsjxx WHERE " & " lr_date LIKE"
sqlstr=sqlstr & "'" & mf & request("findfsz") & mf & "'order by ksrq DESC"
case else
sqlstr="SELECT * FROM tbsjxx order by ksrq DESC"
end select %>
下面是考試的時間自動控制程序(便于演示只設了60秒鐘,實際應用應以系統調出試卷的考試時間為準!):
<SCRIPT language=JavaScript>
<!-- Write by HEKAI for TestTimeContorl
var timerID = null;var timerRunning = false
var stardate = new Date();var startime = gettotalsecond(stardate)
var totaltime = 60; var lasttime;var facetime
function Stepclock(){
// hk made by himself
if(timerRunning)
clearTimeout(timerID)
timerRunning = false }
function startclock(){
Stepclock();showtime() }
function gettotalsecond(getdate){
var hours = getdate.getHours()
var minutes = getdate.getMinutes();var seconds = getdate.getSeconds()
var gettotalsecond = seconds + minutes * 60 + hours * 3600
return(gettotalsecond) }
function showtime(){
var now = new Date();var timeValue = gettotalsecond(now)
document.clock.face.value = timeValue - startime
facetime = document.clock.face.value;lasttime = totaltime - facetime
document.clock.sytime.value = lasttime
timerID = setTimeout("showtime()",1000)
timerRunning = true
if (lasttime == 20){
for(i=1;i<=3;i++){
alert('考試時間只剩下最后20秒!')}}
if (lasttime == 0){
for(i=1;i<=5;i++){
alert('時間完畢!請迅速交卷??!')}}
if (lasttime == -10){
for(i=1;i<=10;i++){
alert('考試時間超過10秒,關閉此窗口!')}}
}//-->
</SCRIPT>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -