php實(shí)現(xiàn)在線考試系統(tǒng)【附源碼】
說(shuō)明:本篇文章是為了記錄下學(xué)習(xí)開發(fā)思路,程序不具備商業(yè)價(jià)值,明白開發(fā)思路,商用需二次升級(jí)!
效果圖如下:
題庫(kù)首頁(yè)展示
試題在線測(cè)試
分?jǐn)?shù)統(tǒng)計(jì)
通過(guò)該小項(xiàng)目目的是練習(xí)PHP基礎(chǔ)知識(shí),通過(guò)對(duì)數(shù)組操作實(shí)現(xiàn)考題信息存儲(chǔ)加載,引入模板文件,實(shí)現(xiàn)考題數(shù)據(jù)的調(diào)用布局。
1、由于小項(xiàng)目未使用數(shù)據(jù)庫(kù),考題以數(shù)組的形式存儲(chǔ)在PHP文件中,部分代碼如下:
<?php//考試題庫(kù)二return [ //題庫(kù)標(biāo)題 'title' => 'PHP基礎(chǔ)語(yǔ)法考試題(二)', //答題時(shí)限(秒數(shù)) 'timeout' => 1200, //題庫(kù) 'data' => [ //判斷題 'binary' => [ 'name' => '判斷題', //題型名稱 'score' => 24, //題型分?jǐn)?shù) 'data' => [ 1 => [ 'question' => '在".php"后綴的文件中,所有的PHP代碼都只能寫在"<?php ?>"標(biāo)記內(nèi)。', 'answer' => 'no' ], 2=> [ 'question' => '標(biāo)量類型包括布爾型、整型、字符串型和數(shù)組型。', 'answer' => 'no' ], 3=> [ 'question' => 'var_dump是PHP中用于打印變量或表達(dá)式的類型與值等相關(guān)信息的函數(shù)。', 'answer' => 'yes' ] ] ], //單選題 'single' => [ 'name' => '單選題', 'score' => 40, 'data' => [ 1 => [ 'question' => '下列選項(xiàng)中,不區(qū)分大小寫的標(biāo)識(shí)符是( )。', 'option' => [ '函數(shù)名','常量名','變量名','屬性名' ], 'answer' => 'A' ], 2=> [
2、那么如何獲取考題數(shù)據(jù)呢?引入文件即可
$data=require "./data/1.php";
注意,上面考題文件是用return返回的數(shù)組,當(dāng)我們引入文件后,直接將考題數(shù)組數(shù)據(jù)賦給$data變量,再通過(guò)操作$data來(lái)展示題庫(kù)數(shù)據(jù)。
3、變量題庫(kù)文件。
所有的題庫(kù)文件均統(tǒng)一放在/data/目錄下,每個(gè)考試項(xiàng)目對(duì)應(yīng)一個(gè).php文件,想要知道有多少考試數(shù)據(jù),即多少個(gè).php文件,這里我們使用了glob()函數(shù),代碼如下:
//統(tǒng)計(jì)題庫(kù)目錄下的“.php”文件個(gè)數(shù),此處要求題庫(kù)文件名必須是連續(xù)的數(shù)字$count = count(glob('./data/*.php'));
glob()函數(shù)返回的是文件列表的數(shù)組,運(yùn)行g(shù)lob()函數(shù)dump輸出結(jié)果如下:
array(3) { [0]=> string(12) "./data/1.php" [1]=> string(12) "./data/2.php" [2]=> string(12) "./data/3.php"}
因?yàn)榇娣艛?shù)據(jù)的文件名都是連續(xù)的數(shù)字,便于我們通過(guò)循環(huán)讀取考題信息。
4、匿名函數(shù)的使用。
匿名函數(shù)就是沒有函數(shù)名的函數(shù),也稱作閉包函數(shù),經(jīng)常用作毀掉函數(shù)參數(shù)的值,對(duì)于臨時(shí)定義的函數(shù),使用匿名函數(shù)無(wú)需考慮函數(shù)命名沖突的問(wèn)題。這里使用匿名函數(shù)純屬是練習(xí)的目的,我們也可以將如下的代碼封裝成一個(gè)功能函數(shù):
$func = function ($data) use(&$func){ $result = []; foreach ($data as $k=>$v){ //如果是數(shù)組,則繼續(xù)遞歸,如果是字符串,則轉(zhuǎn)義 $result[$k] = is_array($v) ? $func($v) : (is_string($v) ? toHtml($v) : $v); } return $result;};
使用匿名函數(shù)遞歸對(duì)考題數(shù)據(jù)的特殊字符進(jìn)行轉(zhuǎn)義。
5、轉(zhuǎn)義HTML特殊字符。
考題中如果出現(xiàn)HTML標(biāo)記,會(huì)被瀏覽器解析,導(dǎo)致不能按照原樣輸出,因此需要對(duì)題庫(kù)中可能存在的HTML標(biāo)記進(jìn)行字符轉(zhuǎn)義,代碼如下:
//HTML特殊字符轉(zhuǎn)義function toHtml($str) { $str=htmlspecialchars($str,ENT_QUOTES); return str_replace(' ',' ',$str); }
這里使用函數(shù)htmlspecialchars()函數(shù)對(duì)可能存在的特殊字符進(jìn)行轉(zhuǎn)義,這樣再輸出的時(shí)候,就能按照我們想要的格式進(jìn)行輸出。
對(duì)應(yīng)htmlspecialchars()函數(shù)不能對(duì)空格和換行進(jìn)行轉(zhuǎn)義,要對(duì)空格進(jìn)行轉(zhuǎn)義,需要使用str_replace()函數(shù)直接替換,換行符則可以使用nl2br函數(shù)。
6、return返回兩個(gè)值形式。
具體代碼如下:
function getDataInfo($data){ $count = []; //保存某種題型的題目數(shù)量 $score = []; //每道題的分值 foreach ($data as $k=>$v) { $count[$k]=count($v['data']); $score[$k]=round($v['score']/$count[$k]); } return [$count,$score]; //使用list()接收返回值:list($count,$score);順序依次對(duì)應(yīng)}
代碼最后使用return返回了兩個(gè)結(jié)果變量,要接收這兩個(gè)返回值,需要使用list()來(lái)接收一個(gè)數(shù)組賦值,將數(shù)組中的元素依次賦給變量。
7、將要用到的功能封裝成一個(gè)個(gè)功能函數(shù),方便調(diào)用,避免代碼重復(fù)。
這里將所有用到的一些功能盡可能的都封裝為一個(gè)個(gè)函數(shù),當(dāng)使用的時(shí)候引入函數(shù)文件即可,方便管理,提高代碼利用率。
8、使用模板
當(dāng)使用PHP處理好數(shù)據(jù)后,在PHP文件中使用
//引入HTML模板require './view/index.html';
引入HTML模板,在模板中,我們同樣可以插入PHP標(biāo)簽輸出想要的數(shù)據(jù),進(jìn)行動(dòng)態(tài)的顯示數(shù)據(jù)。
在線考試系統(tǒng)請(qǐng)選擇題庫(kù)$v): ?> 時(shí)間:分鐘 總分:分開始考試
直接輸出一個(gè)變量:<?=$value?>
循環(huán)輸出一組變量:<?php foreach($value as $k=>$v): ?>~~~~~~~<?php endforeach; ?>
9、注意三元運(yùn)算符的使用。:?
當(dāng)做一些簡(jiǎn)單的判斷輸出時(shí),使用三元運(yùn)算符: ?可以大大的提升效率,簡(jiǎn)化代碼。
<!-- 答題情況 --> <td><?=$v ? '對(duì)' : '錯(cuò)'?> </td><!-- 得分 --> <td><?=$v ? $score[$type] : 0?> </td>
上述代碼中,$v是一個(gè)bool值,通過(guò)三元運(yùn)算符我們可以省略一大堆if判斷,使代碼看上去更加整潔。
10、頁(yè)面中的計(jì)時(shí)倒計(jì)時(shí)、關(guān)閉頁(yè)面提示、未做考題提交提示、考試時(shí)間結(jié)束自動(dòng)交卷功能是通過(guò)jQuery、javascript來(lái)實(shí)現(xiàn)的,這里不作說(shuō)明。
最后給大家附上程序源碼下載地址:點(diǎn)擊此處下載
總結(jié)
以上所述是小編給大家介紹的PHP htmphp實(shí)現(xiàn)在線考試系統(tǒng)附源碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- PHP實(shí)現(xiàn)的簡(jiǎn)單在線計(jì)算器功能示例
- PHP實(shí)現(xiàn)統(tǒng)計(jì)在線人數(shù)功能示例
- PHP在線打包下載功能示例
- php支付寶在線支付接口開發(fā)教程
- Ajax PHP JavaScript MySQL實(shí)現(xiàn)簡(jiǎn)易無(wú)刷新在線聊天室
- PHP在線調(diào)試執(zhí)行的實(shí)現(xiàn)方法(附demo源碼)
- PHP實(shí)現(xiàn)仿百度文庫(kù),豆丁在線文檔效果(word,excel,ppt轉(zhuǎn)flash)
- PHP+swoole實(shí)現(xiàn)簡(jiǎn)單多人在線聊天群發(fā)
相關(guān)文章
Yii 框架控制器創(chuàng)建使用及控制器響應(yīng)操作示例
這篇文章主要介紹了Yii 框架控制器創(chuàng)建使用及控制器響應(yīng)操作,結(jié)合實(shí)例形式分析了Yii框架控制器調(diào)用、參數(shù)傳遞與響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2019-10-10php檢測(cè)網(wǎng)頁(yè)是否被百度收錄的函數(shù)代碼
下面給出一段php函數(shù),功能是檢測(cè)一個(gè)網(wǎng)頁(yè)是否被百度收錄,直接給出代碼2013-10-10Linux下手動(dòng)編譯安裝PHP擴(kuò)展的例子分享
這篇文章主要介紹了Linux下手動(dòng)編譯安裝PHP擴(kuò)展的例子分享,本文以PDO_MYSQL為例,講解手動(dòng)編譯安裝PHP擴(kuò)展的方法,需要的朋友可以參考下2014-07-07PHP autoload與spl_autoload自動(dòng)加載機(jī)制的深入理解
本篇文章是對(duì)PHP中的autoload與spl_autoload自動(dòng)加載機(jī)制進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP實(shí)現(xiàn)支付寶即時(shí)到賬功能
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)支付寶即時(shí)到賬功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Discuz批量替換帖子內(nèi)容的方法(使用SQL更新數(shù)據(jù)庫(kù))
這篇文章主要介紹了Discuz批量替換帖子內(nèi)容的方法,使用SQL語(yǔ)句實(shí)現(xiàn),用REPLACE函數(shù)批量更新數(shù)據(jù)庫(kù),需要的朋友可以參考下2014-06-06ThinkPHP實(shí)現(xiàn)靜態(tài)緩存和動(dòng)態(tài)緩存示例代碼
本篇文章主要介紹了ThinkPHP實(shí)現(xiàn)靜態(tài)緩存和動(dòng)態(tài)緩存示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05基于php+MySql實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)實(shí)例
這篇文章主要介紹了基于php+MySql實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)實(shí)例,文中通過(guò)圖片功能介紹的非常詳細(xì),文章末尾附帶項(xiàng)目源碼,需要的朋友可以參考下2020-08-08