php開發線上考試培訓系統
說明:本篇文章是為了記錄下學習開發思路,程序不具備商業價值,明白開發思路,商用需二次升級!
(推薦學習:php訓練)
效果圖如下:
問題庫首頁展示
試題線上測驗
#分數統計
透過這個小項目目的是練習PHP基礎知識,透過對數組操作實現考題資訊儲存加載,引入模板文件,實現考題資料的調用佈局。
1、由於小項目未使用資料庫,因此考題以陣列的形式儲存在PHP檔案中,部分程式碼如下:
註:下方程式碼很亂。 。可下載文末的程式原始碼,對照本篇博文觀看。
<?php // 考试题库二 return [ // 题库标题 'title' => 'PHP基础语法考试题(二)', // 答题时限(秒数) 'timeout' => 1200, // 题库 'data' => [ // 判断题 'binary' => [ 'name' => '判断题', // 题型名称 'score' => 24, // 题型分数 'data' => [ 1 => [ 'question' => '在".php"后缀的文件中,所有的PHP代码都只能写在"<?php ?>"标记内。', 'answer' => 'no' ], 2=> [ 'question' => '标量类型包括布尔型、整型、字符串型和数组型。', 'answer' => 'no' ], 3=> [ 'question' => 'var_dump是PHP中用于打印变量或表达式的类型与值等相关信息的函数。', 'answer' => 'yes' ] ] ], // 单选题 'single' => [ 'name' => '单选题', 'score' => 40 , 'data' => [ 1 => [ 'question' => '下列选项中,不区分大小写的标识符是( )。', 'option' => [ '函数名','常量名','变量名','属性名' ], 'answer' => 'A' ], 2=> [
2、那麼如何取得考題資料呢?引入文件即可
$data=require "./data/1.php";
注意,上面考題文件是用return返回的數組,當我們引入文件後,直接將考題數組資料賦給$data變量,再通過操作$ data來展示題庫資料。
3、變數題庫檔。
所有的題庫文件均統一放在/data/目錄下,每個考試項目對應一個.php文件,想要知道有多少考試數據,即多少個.php文件,這裡我們使用了glob()函數,程式碼如下:
//统计题库目录下的“.php”文件个数,此处要求题库文件名必须是连续的数字$count = count(glob('./data/*.php'));
glob()函數傳回的是檔案清單的數組,執行glob()函數dump輸出結果如下:
array(3) { [0]=> string(12) "./data/1.php" [1]=> string(12) "./data/2.php" [2]=> string(12) "./data/3.php"}
因為存放資料的檔案名稱都是連續的數字,方便我們透過循環讀取考題資訊。
4、匿名函數的使用。
匿名函數就是沒有函數名稱的函數,也稱為閉包函數,經常用來作為毀掉函數參數的值,對於暫時定義的函數,使用匿名函數不需要考慮函數命名衝突的問題。這裡使用匿名函數純屬是練習的目的,我們也可以將如下的程式碼封裝成一個功能函數:
$func = function ($data) use(&$func){ $result = []; foreach ($data as $k=>$v){ //如果是数组,则继续递归,如果是字符串,则转义 $result[$k] = is_array($v) ? $func($v) : (is_string($v) ? toHtml($v) : $v); } return $result;};
使用匿名函數遞歸對考題資料的特殊字元進行轉義。
5、轉義HTML特殊字元。
測驗中如果出現HTML標記,會被瀏覽器解析,導致無法依照原樣輸出,因此需要對題庫中可能存在的HTML標記進行字元轉義,程式碼如下:
//HTML特殊字符转义function toHtml($str){ $str=htmlspecialchars($str,ENT_QUOTES); return str_replace(' ',' ',$str);}
這裡使用函數htmlspecialchars()函數對可能存在的特殊字元進行轉義,這樣再輸出的時候,就能按照我們想要的格式進行輸出。
對應htmlspecialchars()函數不能對空格和換行進行轉義,要對空格進行轉義,需要使用str_replace()函數直接替換,換行符則可以使用nl2br函數。
6、return傳回兩個值形式。
具體程式碼如下:
function getDataInfo($data){ $count = []; //保存某种题型的题目数量 $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);顺序依次对应}
程式碼最後使用return回傳了兩個結果變量,要接收這兩個回傳值,需要使用list()來接收一個數組賦值,將數組中的元素依序賦給變數。
7、將要用到的功能封裝成一個個功能函數,方便調用,避免程式碼重複。
這裡將所有用到的一些功能盡可能的都封裝為一個個函數,當使用的時候引入函數檔即可,方便管理,提高程式碼利用率。
8、使用模板
當使用PHP處理好資料後,在PHP檔案中使用
//引入HTML模板require './view/index.html';
引入HTML模板,在模板中,我們同樣可以插入PHP標籤輸出想要的數據,進行動態的顯示數據。
在线考试系统请选择题库$v): ?> 时间:分钟 总分:分开始考试
直接輸出一個變數:=$value?>
#迴圈輸出一組變數:$v) : ?>~~~~~~~
#9、注意三元運算子的使用。 :?
当做一些简单的判断输出时,使用三元运算符: ?可以大大的提升效率,简化代码。
<!-- 答题情况 --><td><?=$v ? '对' : '错'?></td><!-- 得分 --><td><?=$v ? $score[$type] : 0?></td>
上述代码中,$v是一个bool值,通过三元运算符我们可以省略一大堆if判断,使代码看上去更加整洁。
10、页面中的计时倒计时、关闭页面提示、未做考题提交提示、考试时间结束自动交卷功能是通过jQuery、javascript来实现的,这里不作说明。
程序源码下载地址:
http://www.seoalphas.com/data/upload/ueditor/20170629/595494a1f01ea.rar
注:php中文网提供大量免费、原创、高清的php视频教程,并且会定期举行php公益培训!
以上是php開發線上考試培訓系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!