在第二天,我們創建了我們的第一個phpWeChat功能模塊,但是比較簡單。實際生產環境中,我們不可能有如此簡單的需求。更多的情況是數據存儲在MySql數據庫中,我們開發功能模塊的作用就是將這些數據從MySql讀取並通過視圖多樣化的呈現給用戶。
今天我們進入《10天學會phpWeChat》系列教程的第三天:從數據庫讀取數據到視圖。
一、首先,我們創建一個MySql數據文章表(pw_wechat_hello_article)用來存儲要顯示給用戶的數據。
為了簡單明了,這個表我們只保留3個字段:
ID,自增ID int型
title,文章標題字段 varchar型
content,文章內容字段 text型
創建模塊數據表時對於名稱的約定:我們在創建模塊數據表時,表的命名以 pw_父模塊名稱_模塊名稱_表名 來組成。如上面示例的文章表pw_wechat_hello_article由pw_(默認數據表前綴)、wechat(父模塊名)、hello(模塊名)、article(實際表名)通過下划線拼接而成。
如圖所示:
上述表建好后,我們插入一些測試數據。
二、打開前端控制器index.php ,編寫對應路由邏輯。
1 <?php 2 use wechat\hello\hello; 3 use phpWeChat\Area; 4 use phpWeChat\CaChe; 5 use phpWeChat\Config; 6 use phpWeChat\Member; 7 use phpWeChat\Module; 8 use phpWeChat\MySql; 9 use phpWeChat\Order; 10 use phpWeChat\Upload; 11 12 !defined('IN_APP') && exit('Access Denied!'); 13 14 switch($action) 15 { 16 case 'index': 17 //從數據表讀取數據並賦給數組$data 18 $data=MySql::fetchAll("SELECT * FROM `pw_wechat_hello_article` ORDER BY `id` DESC"); 19 20 break; 21 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 22 23 //case 'index': 24 25 //在此寫 index.php?m=hello&a=index 時的邏輯 26 27 //break; 28 29 //case 'list': 30 31 //在此寫 index.php?m=hello&a=list 時的邏輯 32 33 //break; 34 35 //以此類推... 36 37 //case '...': 38 39 //在此寫 index.php?m=hello&a=... 時的邏輯 40 41 //break; 42 43 default: 44 break; 45 } 46 ?>
三、打開前端視圖文件template/default/index.html ,顯示數據給用戶。
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>無標題文檔</title> 6 </head> 7 8 <body> 9 <ul> 10 {loop $data $r} 11 <li> 12 <h1>{$r['title']}</h1> 13 <p>{$r['content']}</p> 14 </li> 15 {/loop} 16 </ul> 17 </body> 18 </html>
訪問URL:http://www.example.com/index.php?m=hello&a=index 則呈現結果如下:
四、對以上代碼的結構優化。
通過以上三個步驟,我們初步完成了數據從MySql到用戶端的呈現過程,僅僅從功能實現上是沒有毛病的。
但是,在控制器里直接寫SQL操作,違背了MVC程序開發思想的初衷。
故此,對於phpWeChat開發者,我們約定:所有涉及SQL數據庫操作的我們都放到模型里,控制器只通過調用模型的方法來實現業務邏輯。功能模塊的模型文件是指模塊目錄下include目錄下的xxx.class.php文件。在這里指hello.class.php。
我們在模型里定義一個dataList()方法,用於數據的讀取。
模型(include/hello.class.php):
1 <?php 2 // +---------------------------------------------------------------------- 3 // | phpWeChat hello 操作類 Last modified 2016-12-28 00:02:22 4 // +---------------------------------------------------------------------- 5 // | Copyright (c) 2009-2016 phpWeChat http://www.phpwechat.com All rights reserved. 6 // +---------------------------------------------------------------------- 7 // | Author: 騎馬的少年 <phpwechat@126.com> <http://www.phpwechat.com> 8 // +---------------------------------------------------------------------- 9 namespace wechat\Hello; 10 11 use phpWeChat\Area; 12 use phpWeChat\CaChe; 13 use phpWeChat\Config; 14 use phpWeChat\DataInput; 15 use phpWeChat\DataList; 16 use phpWeChat\Member; 17 use phpWeChat\Module; 18 use phpWeChat\MySql; 19 use phpWeChat\Order; 20 use phpWeChat\Upload; 21 22 class Hello 23 { 24 public static $mPageString=''; // 這個靜態成員是系統自帶,請勿刪除 25 private static $mArticleTable='wechat_hello_article'; 26 27 static public function dataList() 28 { 29 //DB_PRE常量是phpWeChat自帶常量,指數據表前綴。 30 31 $data=MySql::fetchAll("SELECT * FROM `".DB_PRE.self::$mArticleTable."` ORDER BY `id` DESC"); 32 33 return $data; 34 } 35 } 36 ?>
此時,前端控制器端稍作改動:
前端控制器(index.php):
1 <?php 2 use wechat\hello\hello; 3 use phpWeChat\Area; 4 use phpWeChat\CaChe; 5 use phpWeChat\Config; 6 use phpWeChat\Member; 7 use phpWeChat\Module; 8 use phpWeChat\MySql; 9 use phpWeChat\Order; 10 use phpWeChat\Upload; 11 12 !defined('IN_APP') && exit('Access Denied!'); 13 14 switch($action) 15 { 16 case 'index': 17 //從數據表讀取數據並賦給數組$data 18 $data=Hello::dataList(); 19 20 break; 21 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 22 23 //case 'index': 24 25 //在此寫 index.php?m=hello&a=index 時的邏輯 26 27 //break; 28 29 //case 'list': 30 31 //在此寫 index.php?m=hello&a=list 時的邏輯 32 33 //break; 34 35 //以此類推... 36 37 //case '...': 38 39 //在此寫 index.php?m=hello&a=... 時的邏輯 40 41 //break; 42 43 default: 44 break; 45 } 46 ?>
訪問URL:http://www.example.com/index.php?m=hello&a=index 則呈現結果如下:
至此,我們順利的以MVC的思想完成了一次數據從數據庫到視圖端呈現給用戶的“壯舉”,一個增強版的phpWeChat小型功能模塊誕生了。
附:MySql數據操作類的方法及參數說明
MySql 操作類操作方法
phpWeChat 封裝了常見的 MySql 增、刪、改操作,具體方法如下表所示。
假設我們創建了一個 pw_test 表,含有自增的 id(INT),標題 title(VARCHAR),內容 content(TEXT) 3個字段。
MySql 操作方法 | 參數說明 | 函數說明 | 用法舉例 |
MySql::insert($tbname,$info) | $tbname 指表名 $info是一個數組 |
將$info包含的數據插入到表$tbname中,成功時返回插入的記錄ID | MySql::insert('pw_test',array('title'=>'標題內容','content'=>'內容詳情')); |
MySql::update($tbname,$info,$where) | $tbname 指表 名$info是一個數組 $where是條件 |
修改滿足條件$where的記錄 | MySql::update('pw_test',array('title'=>'標題內容','content'=>'內容詳情'),'id=1'); |
MySql::mysqlDelete($tbname,$id,$field) | $tbname 指表 $id是指滿足的字段值 $field是指滿足條件的字段名稱 |
刪除滿足條件$field=$id的記錄 | MySql::mysqlDelete('pw_test',1,'id'); MySql::mysqlDelete('pw_test',1,'typeid'); |
MySql::fetchOne($sql) | $sql 指SQL語句 | 返回滿足$sql的一條記錄 | MySql::fetchOne("SELECT * FROM pw_test WHERE id=1"); |
MySql::fetchAll($sql) | $sql 指SQL語句 | 返回滿足$sql的多條記錄 | MySql::fetchAll("SELECT * FROM pw_test WHERE typeid=1 LIMIT 0,10"); |
MySql::query($sql) | $sql 指SQL語句 | 執行$sql語句 | MySql::query("DELETE FROM pw_test WHERE typeid=1"); |
MySql::lastInsertId() | - | 返回最后插入的ID | $insertID= MySql::lastInsertId(); |
MySql::getCount($tbname) | $tbname 指表名 | 返回$tbname 表的記錄條數 | $counts=MySql::getCount('pw_test'); |