Create a gist now

Instantly share code, notes, and snippets.

ข้อสอบออนไลน์ แบบเลือกตอบ แจ้งคะแนนสอบ แต่ไม่เฉลย ส่งเสริมให้ค้นคว้าด้วยตนเอง และฝึกทำได้หลายครั้ง เมื่อทำเสร็จจะบันทึกคะแนนแต่ละรอบเข้า 100 รายการล่าสุด มีใบรับรอง (Certificate) แบบออนไลน์แชร์ไป Social Media เพื่อเป็นขวัญกำลังใจให้กับผู้ที่มีความมุ่งมั่น
<?php
// ปรับปรุง : 2560-01-19 (เริ่มพัฒนา : 2558-01-22 ปรับจาก test10.php)
// =============================
// ลักษณะของโปรแกรม (Program Specification)
// - สุ่มทั้ง คำถาม และคำตอบ
// - จำนวนแบบทดสอบมีเท่าใดก็ได้ ขึ้นกับแฟ้มแบบทดสอบ โดยไม่ต้องแก้ไขโปรแกรม
// - ตัวเลือกมีสูงสุดได้ 7 ตัวเลือก เพราะตัวแปร $c[ ] กำหนดไว้อย่างนั้น
// - ฟังก์ชัน session_save_path() ถูกอธิบายใน Short 12 ของ http://www.thaiall.com/php/indexo.html
// - เพิ่มบริการ share certificate ใน version 2 เมื่อ 20 มกราคม 2560
// =============================
// Variables 1
$bgcolor = "#ddffdd";
if (isset($_REQUEST["subj"])) $gsubj = "subj=".$_REQUEST["subj"]; else $gsubj = "";
if (isset($_SESSION['name'])) $name = $_SESSION['name']; else $name = "";
if (isset($_SESSION['surname'])) $surname = $_SESSION['surname']; else $surname = "";
if (isset($_POST["name"])) {
$name = $_POST["name"];
$_SESSION['name'] = $name;
}
if (isset($_POST["surname"])) {
$surname = $_POST["surname"];
$_SESSION['surname'] = $surname;
}
// =============================
// Variable 2
$version = "2.600120";
$program_name = "tense10.php";
$directory = "http://www.thaiall.com/quiz/";
$data_name_prefix = "tense10";
$data_name = "present1";
$score_name = "tense10score.txt";
$background = "tense10bg.gif";
$t_now = date("M j,Y g:i:s");
$total_user = 100; // เก็บข้อมูลสมาชิกเพียง 100 ระเบียนเท่านั้น
// =============================
// Variable 3
$qid["past1"] = "Past tense (Quiz ID : 1)";
$qid["pastcon1"] = "Past continuous tense (Quiz ID : 2)";
// =============================
// Variable 4
$google300 = '';
$google728 = '';
$google160 = '';
// =============================
// Variable 5
if (isset($_REQUEST["subj"])) $data_name = $_REQUEST["subj"];
// http://www.firstimpressionsimprinting.com/gpage11.html (tense10.gif = boy)
$header = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">'. "<head><title>แบบทดสอบ Tense ชุด ". $data_name ."</title>
<meta http-equiv=content-type content='text/html; charset=windows-874'>
<meta name='keywords' content='tense,present,past,future' />
<meta name='description' content='tense is a verb-based method used to indicate the time' />
<link type='text/css' rel='stylesheet' href='rsp62.css'><link rel='icon' type='image/x-icon' href='rsp.ico' /><style type='text/css'>
textarea{font-family:microsoft sans serif;font-size:14px;color:blue;background:white;}
td{font-family:THChakraPetch,microsoft sans serif;font-size:25px;}
body{font-family:THChakraPetch,microsoft sans serif;font-size:30px;}
</style></head><body bgcolor=$bgcolor topmargin='0' leftmargin='0' style='background-image:url(" . $background . ")'>
<table width=760 align=center bgcolor=black>
<tr><td style='font-size:48px;color:white;text-align:center'>TEN TEST CENTER</td></tr>
<tr><td style='text-align:center'>" . $google728 . "</td></tr></table>";
$header_cert = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">'. "<head><title>CERTIFICATE by TEN TEST CENTER</title>
<meta http-equiv=content-type content='text/html; charset=windows-874'>
<meta name='keywords' content='certificate,ten test cener,enthusiasm,quiz,exercise' />
<meta name='description' content='CERTIFICATE by TEN TEST CENTER คือ ใบรับรอง (Certificate) ที่ออกให้กับผู้เข้ามาทำข้อสอบ และได้คะแนนเต็มในแต่ละชุดข้อสอบ เพื่อเป็นขวัญและกำลังใจแก่ผู้มีความมุ่งมั่นเป็นที่ตั้ง ขอชื่นชม' />
<link type='text/css' rel='stylesheet' href='rsp62.css'><link rel='icon' type='image/x-icon' href='rsp.ico' /><style type='text/css'>
td{font-family:THChakraPetch,microsoft sans serif;font-size:25px;}
body{font-family:THChakraPetch,microsoft sans serif;font-size:30px;}
</style></head><body bgcolor=$bgcolor topmargin='0' leftmargin='0' style='background-image:url(" . $background . ")'>
<table width=760 align=center bgcolor=black>
<tr><td style='font-size:48px;color:white;text-align:center'>CERTIFICATE by TEN TEST CENTER</td></tr>
<tr><td style='text-align:center'>" . $google728 . "</td></tr></table>";
$footer = "<table width=760 align=center cellspacing=1 bgcolor=white><tr><td style='font-size:20px;text-align:center'>
<a href=". $directory . $program_name ."?action=report>สถิติ 100 รายการ</a> : <a href=". $directory . $program_name ."?$gsubj>เริ่มใหม่</a> : <a href=test10.gif>ภาพเตรียมข้อสอบ</a> : <a href=?action=source>รหัสต้นฉบับ</a> : รุ่น $version : เวลา : $t_now
</td></tr></table></body></html>";
$error_name = "<table align=center><td bgcolor=white><font color=red size=6>กรอกชื่อ หรือนามสกุล ไม่ครบ<br/>ต้องอ่านคำชี้แจงนะครับ
ตอนนี้กลับไป [เริ่มใหม่] ได้เลย</td></table>";
$error_subj = "<table align=center><td bgcolor=white><font color=red size=6>ไม่พบแฟ้มวิชาที่ท่านต้องการสอบ<br/>ต้องกลับไปเลือกวิชาให้ถูกต้อง</td></table>";
$remark = "<tr><td bgcolor=#660000 colspan=2><font color=white>
- ถ้าไม่กรอกทั้ง name และ surname จะไม่ตรวจให้
<br/>- ถ้าทำแบบทดสอบไม่ครบทุกข้อ จะไม่ตรวจให้
<br/>- ระบบเก็บผลสอบเพียง 100 ระเบียนล่าสุด
<br/>- ผลการตรวจจะเผยแพร่ทั้ง ชื่อ สกุล คะแนน และเวลา
</td></tr>";
$remark_send = "<font color=red>ต้องกรอกทั้งชื่อ และสกุล(อังกฤษ) และทำทุกข้อ";
// =============================
// Share Certificate
if (isset($_REQUEST["cert"]) && $_REQUEST["cert"] =="share") {
header('Content-Type: text/html; charset=windows-874');
echo $header_cert;
echo "<table width=760 align=center cellspacing=1 bgcolor=#444444><tr><td style='text-align:center;'>";
echo "<img src=$program_name" . "?cert=print&name=" . $_GET['name'] . "&surname=" . $_GET['surname'] . "&course=" . $_GET['course'] . "&time=" . $_GET['time'] . " width=728>";
echo '<br/><font color=white>เพื่อเป็นขวัญและกำลังใจแก่ผู้มีความมุ่งมั่นเป็นที่ตั้งในการทำแบบทดสอบ ขอชื่นชม</font></td></tr></table>";
echo $footer;
exit;
}
// =============================
// Print Certificate
if (isset($_REQUEST["cert"]) && $_REQUEST["cert"] =="print") {
function cthai($str) {
$res=array();
for($i=0;$i<strlen($str);$i++) {
array_push($res,"&#".getThaiUniCodeVal($str[$i]).";");
}
$ress=implode("",$res);
return $ress;
}
function getThaiUniCodeVal($ch) {
if(ord($ch)>128) return (3552+(ord($ch)-128)); else return (ord($ch));
}
header('Content-Type: image/png');
$certbg = 'tense10cert.png';
$font = $_SERVER["DOCUMENT_ROOT"] . "/quiz/rsp_thchakrapetch.ttf";
$im = imagecreatefrompng($certbg);
$blue = ImageColorAllocate($im, 10, 10, 200);
$gname = base64_decode($_GET["name"]);
$gsurname = base64_decode($_GET["surname"]);
$gcourse = base64_decode($_GET["course"]);
$on = base64_decode($_GET["time"]);
// imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text ) 320 - (strlen($name) * 30)
imagettftext($im,30, 0, 320 - (strlen($gname . " " . $gsurname) * 6), 165, $blue, $font, cthai($gname . " " .$gsurname));
imagettftext($im,24, 0, 320 - (strlen($gcourse) * 5), 260, $blue, $font, cthai($gcourse));
imagettftext($im,24, 0, 320 - (strlen($on) * 5), 300, $blue, $font, cthai($on));
imagepng ($im);
imagedestroy($im);
exit;
}
// =============================
// View Source Code
if (isset($_GET["action"])) {
echo $header;
if ($_GET["action"] == "source") {
$ar = file($program_name);
echo "<table align=center width=760><td bgcolor=#dddddd><center><font size=6>SOURCE CODE</font><br/><textarea cols=120 rows=25 wrap=off>";
foreach ($ar as $k=>$v) echo htmlspecialchars($v);
echo "</textarea></td></table>";
}
if ($_GET["action"] == "report") {
$ar = file($score_name);
?>
<table width="760" align="center" cellspacing="1" bgcolor="white"><tr><td>
<b>ความหมายของการทดสอบ</b>
<br/>การทดสอบ (Testing) หรือ การประเมิน (Evaluation) เป็นกลไกสำคัญของการประกันคุณภาพการศึกษา
เป็นตัวบ่งชี้ระดับความสามารถของผู้เรียน ซึ่งมี 2 แบบ คือ แบบทดสอบแบบปรนัย เป็นแบบที่เหมาะสำหรับวัดผลการเรียน
ของผู้เข้าสอบจำนวนมาก มีความเที่ยงตรง และเกณฑ์การให้คะแนนที่เชื่อถือได้ แบบทดสอบแบบอัตนัย
เป็นแบบที่เหมาะกับการวัดความคิดริเริ่มสร้างสรรค์ โดยเปิดให้แสดงความคิดเห็นสำหรับแบบทดสอบที่มีโอกาสถูกได้หลายแบบ
แต่ไม่เหมาะกับผู้เข้าสอบจำนวนมาก
</td><td width="300">
<center>
<?php echo $google300; ?>
</center>
</td></tr></table>
<?php echo "<table width=760 align=center cellspacing=1 bgcolor=#f9f9f9>
<tr bgcolor=black align=center><td align=center colspan=7><font color=white size=6>สถิติผู้ทำแบบทดสอบ</td></tr>
<tr bgcolor=#dddddd align=center><td>ลำดับ</td><td>ชื่อ-สกุล</td><td>รหัสวิชา</td><td>ถูก</td>
<td>ทั้งหมด</td><td>เวลาเริ่ม</td><td>เวลาเสร็จ</td></tr>";
$i=0;
$bg = "";
foreach ($ar as $k=>$v) {
$i++;
if (!isset($_GET["top"]) || $i <= 10) {
$ar = split("\t",$v);
if (strlen($bg) == 0) $bg = " bgcolor=#ddffff"; else $bg = "";
if ($ar[3] == $ar[4]) $bg = " bgcolor=#ffdddd";
echo "<tr $bg><td>$i</td><td><b>$ar[0] $ar[1]</b></td><td><a href=?subj=$ar[2]>$ar[2]</a></td>
<td align=center>$ar[3]</td><td align=center>$ar[4]</td><td>$ar[5]</td><td>$ar[6]</td></tr>";
}
}
echo "</table>";
}
echo $footer;
exit;
}
// =============================
// Get Random value and Read file
$cnt_quiz = 0;
$data_namef = $data_name_prefix . $data_name . ".php";
if (!file_exists($data_namef)) {
echo $error_subj.$footer;
exit;
}
$ar = file($data_namef);
foreach ($ar as $v) {
$q = split("\t",$v);
if (strlen($q[2]) > 0) { // ตรวจว่ามีเฉลยหรือไม่
$qok{$cnt_quiz} = $v;
$rnd{$cnt_quiz} = rand();
$cnt_quiz = $cnt_quiz + 1;
}
}
// =============================
// General Variable
$c[1] = array(1,2,3,4,7,5,6);
$c[2] = array(5,7,2,3,4,1,6);
$c[3] = array(4,1,2,5,7,3,6);
$c[4] = array(2,3,5,4,1,6,7);
$c[5] = array(4,6,7,3,1,2,5);
$c[6] = array(7,6,5,2,4,1,3);
$c[7] = array(2,4,1,3,7,6,5);
// =============================
// Check Answer
if (isset($_POST["action"]) && isset($_SESSION['start'])) {
echo $header;
if ($_POST["action"] == "check") {
if (strlen($_POST["name"]) == 0 || strlen($_POST["surname"]) == 0) {
echo $error_name.$footer;
unset($_SESSION["start"]);
exit;
}
$right = 0;
$wrong = 0;
$qok{$cnt_quiz} = $v;
foreach ($qok as $k=>$v) {
$q = split("\t",$v);
$qans{$q[0]} = $q[2];
}
foreach ($_POST as $k=>$v) {
if ($k != "action" && $k != "name" && $k != "surname" && $k != "total" && $k != "subj") {
if (strlen($v) > 0) {
if ($qans{$k} == $v) $right++; else $wrong++;
}
}
}
$total = $_POST["total"];
if ($total <= ($right + $wrong)) {
$wrong = $total - $right;
echo "<table width=760 align=center cellspacing=1 bgcolor=white>";
echo "<td><center><font size=6><b>ผลการสอบของ</b> ". $_POST["name"] . " " . $_POST["surname"];
echo "<br/><b>ทำถูก</b> = <font color=red>$right ข้อ</font>";
echo " <b>ทำผิด</b> = <font color=red>$wrong ข้อ</font>";
echo " <b>จำนวนข้อสอบ</b> = <font color=red>$total ข้อ</font>" ;
echo "<br/><b>เริ่มทำเวลา</b> = <font color=blue>". $_SESSION['start'] ."</font>";
echo " <b>ทำเสร็จเวลา</b> = <font color=blue>". $t_now ."</font>";
echo "</center></td></table>";
if ($total == $right) {
echo "<table width=760 align=center cellspacing=1 bgcolor=white><td style='text-align:center;font-size:40px;'>";
echo "<a href=$program_name". "?cert=share&name=" . base64_encode($_SESSION['name']) . "&surname=" . base64_encode($_SESSION['surname']) . "&course=" . base64_encode($qid[$data_name]) . "&time=" . base64_encode($_SESSION['start']) . ">";
echo "กดที่นี่<br/>เพื่อแชร์ <b>ใบรับรอง</b><br/>ไปยังเครือข่ายสังคม<br>Press here<br>to share this certificate<br/>in social media</a></td><td>";
echo "<a href=$program_name". "?cert=share&name=" . base64_encode($_SESSION['name']) . "&surname=" . base64_encode($_SESSION['surname']) . "&course=" . base64_encode($qid[$data_name]) . "&time=" . base64_encode($_SESSION['start']) . ">";
echo "<img src=$program_name" . "?cert=print&name=" . base64_encode($_SESSION['name']) . "&surname=" . base64_encode($_SESSION['surname']) . "&course=" . base64_encode($qid[$data_name]) . "&time=" . base64_encode($_SESSION['start']) . " border=0 width=300> ";
echo "</a></td></table>";
}
$data = $_POST["name"]."\t".$_POST["surname"]."\t".$_POST["subj"]."\t";
$data = $data . $right."\t".$total."\t".$_SESSION['start']."\t".$t_now."\n";
$fr = array();
if (file_exists($score_name)) $fr = file($score_name);
$limit = count($fr);
if ($total_user <= $limit) $limit = $total_user - 1;
$fw=fopen ($score_name,"w");
fputs ($fw,$data);
for ($i=0;$i<$limit;$i++) fputs ($fw,$fr[$i]);
fclose ($fw);
echo "<meta http-equiv=refresh content='300;url=". $program_name . "?action=report&top=10'>";
unset($_SESSION["start"]);
// session_unset();
} else {
echo "<table align=center><td bgcolor=white><center><font color=red size=6>ท่านทำข้อสอบเพียง : " . ($right + $wrong) ." ข้อ<br/>";
echo "ไม่ครบ ". $total . " ข้อ<br/>จึงไม่ตรวจให้ .. ท่านต้องกลับไปทำให้ครบ</td></tr></table>";
}
}
} else {
// =============================
// Show Question
$ar = file($data_namef);
$q = split("\t",$ar[0]);
echo $header;
$_SESSION['start'] = $t_now;
// ทีแรกคิดว่าจะส่ง value ทั้งผ่าน post และ get แต่ส่งไปให้กับ image แล้ว จึงยกเลิก get
//echo "<form id=testten action='$directory". $program_name . "?name=" . base64_encode($_SESSION['name']) . "&surname=" . base64_encode($_SESSION['surname']) . "&course=" . base64_encode($qid[$data_name]) . "&time=" . base64_encode($t_now) . "' method=post>
//<table width='760' align='center' border='1' bordercolor='black' cellspacing='0'>
//<tr><td bgcolor=#dddddd><center><b>$qid[$data_name]</b></center>";
echo "<form id=testten action='$directory". $program_name . "' method=post>
<table width='760' align='center' border='1' bordercolor='black' cellspacing='0'>
<tr><td bgcolor=#dddddd><center><b>$qid[$data_name]</b></center>";
asort($rnd); // ทำให้ array จัดเรียงตามค่าสุ่ม
$total_question = 0;
echo "<table><td><table width='600' align='center' style='background-color:#f2f2f2;'>";
$bg = "";
foreach ($rnd as $k=>$v) {
$total_question++;
$q = split("\t",$qok{$k});
if (strlen($bg) == 0) $bg = " bgcolor='#ffffdd'"; else $bg = "";
echo "<tr $bg><td style='font-size:40px'>";
echo $total_question.". ".$q[1];
$cok = rand(1,7);
for($i=3;$i<10;$i++) {
if (isset($q[$c[$cok][$i - 3] + 2])) {
if (strlen($q[$c[$cok][$i - 3] + 2]) > 0 && $q[$c[$cok][$i - 3] + 2] != "\r\n" && $q[$c[$cok][$i - 3] + 2] != "\n")
echo "<dd><input type='radio' name=$q[0] value='". ($c[$cok][$i - 3]) ."'>". $q[$c[$cok][$i - 3] + 2]."</dd>";
}
}
echo "</td>";
// if ($total_question == 1) { echo ""; } เดิมวาง banner แนวตั้งที่นี่ แต่มีปัญหาการกด tab เลือกคำตอบตอบ จะเสียลำดับการทำงาน จึงย้ายไปนอกลูป
echo "</tr>";
}
echo "</table></td><td width=160 valign=top bgcolor=gray>$google160</td></table>";
echo "<table width=760 bgcolor=white align=center><tr><td>";
echo "<table width='400' align='center' bgcolor='#dddddd'>
<tr><td bgcolor='black' colspan=2><font size='6' color='white'>คำชี้แจง</td></tr>
$remark
<tr><td align='right'>name :</td><td><input name='name' type=textbox size='20' value='$name'> ex. burin</td></tr>
<tr><td align='right'>surname :</td><td><input name='surname' type=textbox size='20' value='$surname'> ex. rujjanapan</td></tr>
</table><center><input type='submit' value='ส่งคำตอบ' style='width:250px;font-size:30px;height:50px;background-color:#ffff00'>
<br/>$remark_send
<input type='hidden' value='check' name='action'>
<input type='hidden' value=$total_question name='total'>
<input type='hidden' value=$data_name name='subj'>";
echo "</td><td>". $google300 . "</td></table></form>";
}
echo $footer;
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment