10天學會phpWeChat——第三天:從數據庫讀取數據到視圖


在第二天,我們創建了我們的第一個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');            

 

《10天學會phpWeChat》系列教程傳送門:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM