ศูนย์สอบ online หลายชุด
เว็บเพจสำรอง (Backup Webpages) : http://www.thaiall.com/asp/quizsam.htm | http://www.thaiabc.com/asp/quizsam.htm
ปรับปรุง : 2549-09-10 (ปรับ quiz.mdb)
ศูนย์สอบ online หลายชุด
    สารบัญ
  1. ข้อควรทราบ
  2. การเลือกชุดข้อสอบหลายแบบ [ การใช้ java และ form ]
  3. โปรแกรม asp สร้างข้อสอบ [ ในโปรแกรมนี้มีทั้งเรียกข้อสอบมา และตรวจในตัว ]
  4. แบบฝึกหัด
บทเรียนนี้มีตัวอย่างการประมวลผลที่ http://thaiall.thailandhosting.net/asp/

ข้อควรทราบ
  1. บทเรียนนี้ ผมเขียนขึ้นโดยมี แรงจูงใจจากนักศึกษาหลาย ๆ สถาบัน mail มาถาม เพื่อนำไปทำ project ว่าทำข้อสอบ online นั้นทำไง เพราะผมเขียนเป็นบทเรียนข้อสอบ online ด้วยภาษา perl มาก่อน แต่ไม่ได้ทำในส่วนของ asp บัดนี้ได้ ฤกษ์แล้วครับ จะได้แบ่งเวลาไปทำอย่างอื่นบ้าง มีอีกเยอะที่ยังไม่ได้ทำครับ
  2. บ่อยครั้งที่ท่านสร้าง mdb ขึ้นมาเองแล้วใช้ไม่ได้ ลอง copy แฟ้มข้อสอบผมไปทดลอง นะครับ http://www.thaiabc.com/asp/quiz.mdb ขนาดแค่ 84 kb เพราะถ้าสร้างด้วย access 97 ของท่าน บางทีใช้ในเครื่องท่านได้ แต่ upload ไปแล้วเขาไม่รู้จัก format ของ mdb ตัวใหม่นั้นนะครับ
  3. ในระบบข้อสอบนี้มีแฟ้มที่ต้องใช้เพียง 2 แฟ้มคือ quizsam.asp และ quiz.mdb สำหรับการใช้งานที่ thaiall.thailandhosting.net/asp/ นั้นผมเก็บ quizsam.asp ที่ root และ เก็บ quiz.mdb ที่ห้อง /db เพราะเขากำหนดไว้อย่างนั้น
  4. แฟ้มข้อมูล quiz.mdb มีขนาด 84KB เป็นข้อสอบประกอบด้วย 3 table คือ math01(5ข้อ) engl01(6ข้อ) และ thai01(7ข้อ) ทุกตารางมี 7 เขตข้อมูล(field) เหมือนกันหมด และแฟ้ม quiz.mdb นี้ผมทดสอบที่ ewebcity ซึ่งบังคับให้แฟ้ม access เก็บในห้อง /db ซึ่งต้องปฏิบัติตามโดยเคร่งครัด
    1. รหัสเลขข้อสอบ ( QID ) เป็นแบบ TEXT เก็บ 10 character
    2. คำถาม ( QUESTION ) เป็นแบบ TEXT เก็บ 255 character
    3. ตัวเลือกที่หนึ่ง ( CHOICE1 ) เป็นแบบ TEXT เก็บ 255 character
    4. ตัวเลือกที่สอง ( CHOICE2 ) เป็นแบบ TEXT เก็บ 255 character
    5. ตัวเลือกที่สาม ( CHOICE3 ) เป็นแบบ TEXT เก็บ 255 character
    6. ตัวเลือกที่สี่ ( CHOICE4 ) เป็นแบบ TEXT เก็บ 255 character
    7. คำตอบ ( ANS ) เป็นแบบ BYTE ซึ่งสามารถเก็บค่าตั้งแต่ 0 ถึง 255
  5. โปรแกรมนี้จะมีการรับส่งตัวแปรภายนอก 2 ตัวคือ subj และ process สำหรับ subj นั้นใช้เลือกชุดข้อสอบ หรือตารางที่นำมาเป็นชุดข้อสอบ และตัวแปร process ใช้สำหรับตัดสินว่าจะเป็นการแสดงข้อสอบ หรือตรวจคำตอบ สำหรับข้อสอบในชุดที่ถูกเลือกมานั้น และผมได้ปรับโปรแกรมให้รับได้ทั้งแบบ request.form("varname") และ request.querystring("varname")
  6. บทเรียนนี้ไม่ได้เขียนให้ นำไปใช้ได้ทันที แต่เขียนให้ศึกษา และสามารถนำไปประยุกต์ใช้ เช่น การเพิ่มสถิติการทำข้อสอบในแต่ละชุด การสุ่มข้อสอบขึ้นมา การแสดงผลการทำในรูป graph เป็นต้น

การเลือกชุดข้อสอบหลายแบบ
การเลือกข้อสอบผ่าน URL ด้วย querystring
เช่น การเรียก URL ว่า http://thaiall.thailandhosting.net/asp/quizsam.asp?subj=engl01&process=show
ซึ่งการอ้างถึงตัวแปร 2 ตัวที่ส่งเข้าไป ใช้คำว่า request.querystring("process") และ request.querystring("subj")
หรือจะทำ link ตามตัวอย่างข้างล่างนี้ก็ได้เลย
- คณิตศาสตร์ <a href=http://thaiall.thailandhosting.net/asp/quizsam.asp?subj=engl01&process=show>คณิตศาสตร์</a>
- ภาษาอังกฤษ <a href=http://thaiall.thailandhosting.net/asp/quizsam.asp?subj=engl01&process=show>ภาษาอังกฤษ</a>
- ภาษาไทย <a href=http://thaiall.thailandhosting.net/asp/quizsam.asp?subj=engl01&process=show>ภาษาไทย</a>
การเลือกข้อสอบผ่าน Form : selection
form ที่ไม่มีการกำหนด size จะมีตัวเลือกช่องเดียว
เพิ่มคำว่า size=3 ไปใน tag ของ select

Source Code ที่ใช้
<html><head><title>drop down & go</title></head>
<body>
<form name = "jumpform1">
<SELECT NAME="pages1" onChange="window.status = this.options[this.selectedIndex].text">
<OPTION VALUE="http://thaiall.thailandhosting.net/asp/quizsam.asp?subj=math01&process=show">คณิตศาสตร์
<OPTION VALUE="http://thaiall.thailandhosting.net/asp/quizsam.asp?subj=engl01&process=show">ภาษาอังกฤษ
<OPTION VALUE="http://thaiall.thailandhosting.net/asp/quizsam.asp?subj=thai01&process=show">ภาษาไทย
</SELECT>
<input value="Go" type=button onClick="jump(document.jumpform1.pages1.options[pages1.selectedIndex].value)">
</form>
</body></html>
<script language="JavaScript">
<!--
function jump (page) {
window.location = page;
}       
//-->
</script>

ตัวอย่างเรื่อง JAVA script: jump นี้ผมดูมาจาก http://www.thaiall.com/java

โปรแกรม asp สร้างข้อสอบ
โปรแกรมนี้ใช้ตัวแปรหลักควบคุม 2 ตัวคือ subj และ process
- ค่าที่เป็นไปได้ของ subj มีเพียง 3 ค่าคือ math01 engl01 และ math01
- ค่าที่เป็นไปได้ของ process มีเพียง 2 ค่าคือ show และ check
ถ้าอยู่ในสถานะ show จะเป็นการนำข้อสอบมาให้ทำ และมีปุ่ม submit ให้ส่งคำตอบไปตรวจ ซึ่งการส่ง จะส่งพร้อมตัวแปรข้อ ตัวแปรคำตอบ และตัวแปรที่ท่านตอบไปตรวจด้วย หากสังเกตุให้ดี จะพบว่าการส่งค่าตัวแปรที่เก็บลง g_c ซึ่งรับมาจาก form นั้น ไม่จำเป็นสำหรับโปรแกรมชุดนี้ เพราะเราสามาเรียกค่าจาก rec("ans") มาได้อยู่แล้ว เพราะเป็นค่าเดียวกัน และการตรวจสอบ g_qid = rec("qid") ในกรณีนี้ก็ไม่จำเป็น เพราะยังไง ลำดับของข้อสอบก็ต้องเรียงตาม ข้อมูลจากฟอร์มที่ส่งเข้ามาอยู่แล้ว
หลังจากกดปุ่ม submit จะเข้าโปรแกรม quizsam.asp อีกครั้ง แต่จะเปลี่ยนสถานนะตัวเองเป็น check เพื่อตรวจว่าที่ตอบมานั้นถูกผิดอย่างไร ซึ่งผมจะขอแบ่ง Source Code ให้ดูเป็น 2 ส่วน คือ สีน้ำเงินเข้ม คือสำหรับส่วน show และ ส่วนเขียวเข้มสำหรับส่วนตรวจคำตอบ หวังว่าจะอ่านโปรแกรมเข้าใจ และนำไปใช้ได้นะครับ
Source code ของ quizsam.asp
Source Code of quizsam.asp
<%
' math01 or thai01 or engl01
qchoose = request.form("subj") + request.querystring("subj") 
' show or check
qprocess = request.form("process") + request.querystring("process") 
' default ถ้าไม่มีการส่งค่า จะกำหนดเป็น math01 และ show
if len(qchoose) < 2 then qchoose = "math01"
if len(qprocess) < 2 then qprocess = "show"
'
Set objConn = Server.CreateObject("ADODB.Connection")
Set rec = Server.CreateObject("ADODB.Recordset")
objConn.Open  "Driver={Microsoft Access Driver (*.mdb)};" & "DBQ=" & Server.Mappath("\thaiall\db\quiz.mdb")
strSQL = "select * from "& qchoose &";"
rec.Open strSQL, objConn , 2, 3 
%>
<html><head><title>ศูนย์สอบ online http://www.thaiall.com/quiz </title></head>
<body bgcolor="#ffffdd"><font face="microsoft sans serif">
ตัวอย่างข้อสอบ online ด้วย ASP (<a href=http://www.thaiall.com target=_blank>thaiall.com</a>)
<ul>
<%
if qprocess = "show" then 
response.write(request.form("subj"))
response.write("<form method=post action=http://thaiall.thailandhosting.net/asp/quizsam.asp>")
response.write("<input name=subj type=hidden value=" & qchoose &">")
response.write("<input name=process type=hidden value=check>")
i = 1
if Not rec.eof then rec.MoveFirst
do while Not rec.eof and i <= 10     
   response.write( "<b>"& i & ". " & rec("question") & "</b> - " & rec("qid") &"<br>")            
   response.write( "<input type=hidden name=gqid" & i & " value="  & rec("qid") &">")      
   response.write( "<input type=hidden name=gans" & i & " value="  & rec("ans") &">")      
   response.write( "<input type=radio name=c" & i & " value=1>ก. "  & rec("choice1") &"<br>")   
   response.write( "<input type=radio name=c" & i & " value=2>ข. "  & rec("choice2") &"<br>")      
   response.write( "<input type=radio name=c" & i & " value=3>ค. "  & rec("choice3") &"<br>")   
   response.write( "<input type=radio name=c" & i & " value=4>ง. "  & rec("choice4") &"<br>")   
   response.write( "<hr>")   
   rec.MoveNext
   i = i + 1
loop
response.write( "<input type=submit name=submit value=ตรวจสอบคำตอบ(Submit)>" )
response.write( "<input type=reset name=reset value=ยกเลิก(Reset)>" ) 
response.write( "</form><hr>" )
else
i = 1
if Not rec.eof then rec.MoveFirst
do while Not rec.eof and i <= 10        
   g_qid = request.form("gqid" & i)
   g_ans = request.form("gans" & i)
   g_c = request.form("c" & i)
   response.write( "<b>"& i & ". " & rec("question") & "</b> - " & rec("qid") &"<br>")               
   if g_qid = rec("qid") then     
     if g_ans = 1 then 
       response.write( "<font color=#ff0000>ก. "& rec("choice1") &"</font><br>") 
     else   
       response.write( "ก. " & rec("choice1") &"<br>")   
     end if
     if g_ans = 2 then 
       response.write( "<font color=#ff0000>ข. "& rec("choice2") &"</font><br>") 
     else   
       response.write( "ข. " & rec("choice2") &"<br>")         
     end if
     if g_ans = 3 then 
       response.write( "<font color=#ff0000>ค. "& rec("choice3") &"</font><br>") 
     else     
       response.write( "ค. " & rec("choice3") &"<br>")   
     end if
     if g_ans = 4 then 
       response.write( "<font color=#ff0000>ง. "& rec("choice4") &"</font><br>") 
     else          
       response.write( "ง. " & rec("choice4") &"<br>")           
     end if
     if g_ans = g_c then
       response.write("<font color=#0000ff>Right.</font>")
     else
       response.write("Wrong. Try again. [" & g_c & "]")
     end if
   end if
   response.write("<hr>")   
   rec.MoveNext
   i = i + 1
loop
end if
rec.close
set rec = nothing
%>
[ <a href=http://thaiall.thailandhosting.net/asp/quizsam.asp?subj=engl01&process=show>ภาษาอังกฤษเบื้องต้น</a> |
<a href=http://thaiall.thailandhosting.net/asp/quizsam.asp?subj=thai01&process=show>ภาษาไทยเบื้องต้น</a> |
<a href=http://thaiall.thailandhosting.net/asp/quizsam.asp?subj=math01&process=show>คณิตศาสตร์เบื้องต้น</a> ]
</ul>
</body></html>


[ ดูเฉพาะ Source code เท่านั้น | Run โปรแกรมนี้เพื่อดูเป็นตัวอย่าง ]

แบบฝึกหัด
    ให้ทำตามโจทย์ต่อไปนี้
  1. ให้ copy แฟ้ม และโปรแกรม ไปทดสอบในเว็บของท่าน
  2. ลองเปลี่ยนข้อสอบ หรือโครงสร้างแฟ้มตามที่ท่านต้องการดูนะครับ
  3. ให้เพิ่มระบบ ตรวจสถิติ ว่าถูกผิดกี่ข้อ กี่เปอร์เซ็น
  4. ให้ทำระบบสุ่มข้อสอบไม่ให้ซ้ำกันดูนะครับ .. ท้าทายดีครับ
  5. เพิ่มระบบเก็บประวัติผู้เข้าใช้บริการก็จะยิ่งเยี่ยมไปเลย

แนะนำเว็บใหม่ : แสดงผลการจัดอันดับ
รักลำปาง : lampang.thcity.com : thailandhosting.net : topsiam.com : cookkoo.com : โยนก
ศูนย์สอบ : รวมบทความ : Download : yourname@thaiall.com
ติดต่อ ทีมงาน ชาวลำปาง มีฝันเพื่อการศึกษา Tel.0-1992-7223