數據庫的操作(CRUD)是一個現代化計算機軟件的核心,尤其針對web應用軟件。雖然在前面的幾講里,我們針對數據庫操作大致有了一些了解,但今天我們需要再次強化下。
除了新瓶裝老酒,我們今天還引入一個新的數據庫操作方法:連貫操作。
今天講解的內容是基於phpWeChat核心框架1.1.3版本,
下載地址:http://s.phpwechat.com/app_38026ed22fc1a91d92b5d2ef93540f20
框架更新:http://bbs.phpwechat.com/forum-2-1.html
如果您的核心框架不是1.1.3,強烈建議您升級版本,升級時,請注意由低版本到高版本逐級升級,請不要跨版本升級。
我們今天的講解以hello world模塊創建的pw_wechat_hello_article表為例,並在控制器里寫一個case 'test':來進行實際演示。
一、MySql數據操作類的傳統方法及參數說明
phpWeChat 封裝了常見的 MySql 增、刪、改操作,具體方法如下表所示。
假設我們創建了一個 pw_wechat_hello_article表,含有自增的 id(INT),標題 title(VARCHAR),內容 content(TEXT) 3個字段。
| MySql 操作方法 | 參數說明 | 函數說明 | 用法舉例 |
| MySql::insert($tbname,$info) | $tbname 指表名 $info是一個數組 |
將$info包含的數據插入到表$tbname中,成功時返回插入的記錄ID | MySql::insert('pw_wechat_hello_article',array('title'=>'標題內容','content'=>'內容詳情')); |
| MySql::update($tbname,$info,$where) | $tbname 指表 名$info是一個數組 $where是條件 |
修改滿足條件$where的記錄 | MySql::update('pw_wechat_hello_article',array('title'=>'標題內容','content'=>'內容詳情'),'id=1'); |
| MySql::mysqlDelete($tbname,$id,$field) | $tbname 指表 $id是指滿足的字段值 $field是指滿足條件的字段名稱 |
刪除滿足條件$field=$id的記錄 | MySql::mysqlDelete('pw_wechat_hello_article',1,'id'); |
| MySql::fetchOne($sql) | $sql 指SQL語句 | 返回滿足$sql的一條記錄 | MySql::fetchOne("SELECT * FROM pw_wechat_hello_article WHERE id=1"); |
| MySql::fetchAll($sql) | $sql 指SQL語句 | 返回滿足$sql的多條記錄 | MySql::fetchAll("SELECT * FROM pw_wechat_hello_article WHERE id>1 LIMIT 0,10"); |
| MySql::query($sql) | $sql 指SQL語句 | 執行$sql語句 | MySql::query("DELETE FROM pw_wechat_hello_article WHERE id=1"); |
| MySql::lastInsertId() | - | 返回最后插入的ID | $insertID= MySql::lastInsertId(); |
| MySql::getCount($tbname) | $tbname 指表名 | 返回$tbname 表的記錄條數 | $counts=MySql::getCount('pw_wechat_hello_article'); |
二、Read——數據庫讀操作的傳統操作和連貫操作示例
1、讀取pw_wechat_hello_articleID大於1的2條多條記錄並按照ID降序排列:
控制器代碼:
1 <?php 2 //自適應模塊的PC前端控制器 3 use wechat\hello\hello; 4 use phpWeChat\Area; 5 use phpWeChat\CaChe; 6 use phpWeChat\Config; 7 use phpWeChat\Member; 8 use phpWeChat\Module; 9 use phpWeChat\MySql; 10 use phpWeChat\Order; 11 use phpWeChat\Upload; 12 13 !defined('IN_APP') && exit('Access Denied!'); 14 15 switch($action) 16 { 17 case 'test': 18 //傳統SQL寫法 19 $data=MySql::fetchAll("SELECT * FROM ".DB_PRE."wechat_hello_article WHERE id>1 ORDER BY id DESC LIMIT 0,2"); 20 print_r($data); 21 22 //連貫操作 23 $article=M('wechat_hello_article'); 24 $data=$article->where('id>1')->order('id','desc')->limit(2)->select(); 25 print_r($data); 26 exit(); 27 break; 28 case 'index': 29 //從數據表讀取數據並賦給數組$data 30 //$data=Hello::dataList(); 31 echo '這是自適應模塊的PC端前端控制器'; 32 exit(); 33 break; 34 case 'detail': 35 $data=Hello::dataGet($id); //$id 可以改成$_GET['id'] 36 break; 37 case 'tougao': 38 39 break; 40 case 'tougaosave': 41 $info['pics']=deformat_focus_img('pics'); //多圖上傳的特殊處理,其他類型不需要 42 43 print_r($info); 44 exit(); 45 46 /* 47 $op=Hello::dataInsert($info); 48 49 if($op) 50 { 51 echo '文章投稿成功,ID為'.$op; 52 } 53 else 54 { 55 echo '文章投稿失敗'; 56 } 57 exit(); 58 */ 59 break; 60 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 61 62 //case 'index': 63 64 //在此寫 index.php?m=hello&a=index 時的邏輯 65 66 //break; 67 68 //case 'list': 69 70 //在此寫 index.php?m=hello&a=list 時的邏輯 71 72 //break; 73 74 //以此類推... 75 76 //case '...': 77 78 //在此寫 index.php?m=hello&a=... 時的邏輯 79 80 //break; 81 82 default: 83 break; 84 } 85 ?>
效果:

如圖,在控制器中,傳統操作和連貫操作的效果是一樣的,只是連貫操作給人感覺更簡潔、更炫酷。
2、讀取pw_wechat_hello_article ID為2的1條記錄:
1 <?php 2 //自適應模塊的PC前端控制器 3 use wechat\hello\hello; 4 use phpWeChat\Area; 5 use phpWeChat\CaChe; 6 use phpWeChat\Config; 7 use phpWeChat\Member; 8 use phpWeChat\Module; 9 use phpWeChat\MySql; 10 use phpWeChat\Order; 11 use phpWeChat\Upload; 12 13 !defined('IN_APP') && exit('Access Denied!'); 14 15 switch($action) 16 { 17 case 'test': 18 //傳統SQL寫法 19 $data=MySql::fetchOne("SELECT * FROM ".DB_PRE."wechat_hello_article WHERE id=5"); 20 print_r($data); 21 22 //連貫查詢 23 $article=M('wechat_hello_article'); 24 $data=$article->where('id=5')->find(); 25 print_r($data); 26 exit(); 27 break; 28 case 'index': 29 //從數據表讀取數據並賦給數組$data 30 //$data=Hello::dataList(); 31 echo '這是自適應模塊的PC端前端控制器'; 32 exit(); 33 break; 34 case 'detail': 35 $data=Hello::dataGet($id); //$id 可以改成$_GET['id'] 36 break; 37 case 'tougao': 38 39 break; 40 case 'tougaosave': 41 $info['pics']=deformat_focus_img('pics'); //多圖上傳的特殊處理,其他類型不需要 42 43 print_r($info); 44 exit(); 45 46 /* 47 $op=Hello::dataInsert($info); 48 49 if($op) 50 { 51 echo '文章投稿成功,ID為'.$op; 52 } 53 else 54 { 55 echo '文章投稿失敗'; 56 } 57 exit(); 58 */ 59 break; 60 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 61 62 //case 'index': 63 64 //在此寫 index.php?m=hello&a=index 時的邏輯 65 66 //break; 67 68 //case 'list': 69 70 //在此寫 index.php?m=hello&a=list 時的邏輯 71 72 //break; 73 74 //以此類推... 75 76 //case '...': 77 78 //在此寫 index.php?m=hello&a=... 時的邏輯 79 80 //break; 81 82 default: 83 break; 84 } 85 ?>
效果:

小貼士:
傳統操作的MySql::fetchAll()方法等同於連貫操作的select()方法,他們都返回一個由結果集組成的二維數組。
傳統操作的MySql::fetchOne()方法等同於連貫操作的find()方法,他們都返回一個指定結果的一維數組。
三、Create——數據庫寫操作的傳統操作和連貫操作示例
向數據庫插入一條記錄。
1 <?php 2 //自適應模塊的PC前端控制器 3 use wechat\hello\hello; 4 use phpWeChat\Area; 5 use phpWeChat\CaChe; 6 use phpWeChat\Config; 7 use phpWeChat\Member; 8 use phpWeChat\Module; 9 use phpWeChat\MySql; 10 use phpWeChat\Order; 11 use phpWeChat\Upload; 12 13 !defined('IN_APP') && exit('Access Denied!'); 14 15 switch($action) 16 { 17 case 'test': 18 $info=array(); 19 $info['title']='要插入的標題'; 20 $info['content']='要插入的內容'; 21 22 //傳統SQL寫法 23 $insert_id=MySql::insert(DB_PRE."wechat_hello_article",$info); 24 echo('插入的ID'.$insert_id); 25 26 //連貫查詢 27 $article=M('wechat_hello_article'); 28 $insert_id=$article->add($info); //或者 $data=$article->data($info)->add(); 29 echo('插入的ID'.$insert_id); 30 exit(); 31 break; 32 case 'index': 33 //從數據表讀取數據並賦給數組$data 34 //$data=Hello::dataList(); 35 echo '這是自適應模塊的PC端前端控制器'; 36 exit(); 37 break; 38 case 'detail': 39 $data=Hello::dataGet($id); //$id 可以改成$_GET['id'] 40 break; 41 case 'tougao': 42 43 break; 44 case 'tougaosave': 45 $info['pics']=deformat_focus_img('pics'); //多圖上傳的特殊處理,其他類型不需要 46 47 print_r($info); 48 exit(); 49 50 /* 51 $op=Hello::dataInsert($info); 52 53 if($op) 54 { 55 echo '文章投稿成功,ID為'.$op; 56 } 57 else 58 { 59 echo '文章投稿失敗'; 60 } 61 exit(); 62 */ 63 break; 64 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 65 66 //case 'index': 67 68 //在此寫 index.php?m=hello&a=index 時的邏輯 69 70 //break; 71 72 //case 'list': 73 74 //在此寫 index.php?m=hello&a=list 時的邏輯 75 76 //break; 77 78 //以此類推... 79 80 //case '...': 81 82 //在此寫 index.php?m=hello&a=... 時的邏輯 83 84 //break; 85 86 default: 87 break; 88 } 89 ?>
效果:

小貼士:
傳統操作的MySql::insert()方法等同於連貫操作的add()方法,成功插入時,他們都返回插入的記錄ID,失敗時,返回FALSE。
四、Update——數據庫更新操作的傳統操作和連貫操作示例
更新ID為11的文章標題為“我是新標題”。
1 <?php 2 //自適應模塊的PC前端控制器 3 use wechat\hello\hello; 4 use phpWeChat\Area; 5 use phpWeChat\CaChe; 6 use phpWeChat\Config; 7 use phpWeChat\Member; 8 use phpWeChat\Module; 9 use phpWeChat\MySql; 10 use phpWeChat\Order; 11 use phpWeChat\Upload; 12 13 !defined('IN_APP') && exit('Access Denied!'); 14 15 switch($action) 16 { 17 case 'test': 18 $info=array(); 19 $info['title']='我是新標題'; 20 21 //傳統SQL寫法 22 MySql::update(DB_PRE."wechat_hello_article",$info,'id=11'); 23 24 //連貫查詢 25 $article=M('wechat_hello_article'); 26 $article->where('id=11')->data($info)->save(); //或者 $data=$article->save($info); 27 28 exit(); 29 break; 30 case 'index': 31 //從數據表讀取數據並賦給數組$data 32 //$data=Hello::dataList(); 33 echo '這是自適應模塊的PC端前端控制器'; 34 exit(); 35 break; 36 case 'detail': 37 $data=Hello::dataGet($id); //$id 可以改成$_GET['id'] 38 break; 39 case 'tougao': 40 41 break; 42 case 'tougaosave': 43 $info['pics']=deformat_focus_img('pics'); //多圖上傳的特殊處理,其他類型不需要 44 45 print_r($info); 46 exit(); 47 48 /* 49 $op=Hello::dataInsert($info); 50 51 if($op) 52 { 53 echo '文章投稿成功,ID為'.$op; 54 } 55 else 56 { 57 echo '文章投稿失敗'; 58 } 59 exit(); 60 */ 61 break; 62 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 63 64 //case 'index': 65 66 //在此寫 index.php?m=hello&a=index 時的邏輯 67 68 //break; 69 70 //case 'list': 71 72 //在此寫 index.php?m=hello&a=list 時的邏輯 73 74 //break; 75 76 //以此類推... 77 78 //case '...': 79 80 //在此寫 index.php?m=hello&a=... 時的邏輯 81 82 //break; 83 84 default: 85 break; 86 } 87 ?>
效果:

小貼士:
傳統操作的MySql::update()方法等同於連貫操作的save()方法,用於記錄更新。
五、Delete——數據庫刪除操作的傳統操作和連貫操作示例
刪除ID為11的文章。
1 <?php 2 //自適應模塊的PC前端控制器 3 use wechat\hello\hello; 4 use phpWeChat\Area; 5 use phpWeChat\CaChe; 6 use phpWeChat\Config; 7 use phpWeChat\Member; 8 use phpWeChat\Module; 9 use phpWeChat\MySql; 10 use phpWeChat\Order; 11 use phpWeChat\Upload; 12 13 !defined('IN_APP') && exit('Access Denied!'); 14 15 switch($action) 16 { 17 case 'test': 18 //傳統SQL寫法 19 MySql::mysqlDelete(DB_PRE."wechat_hello_article",11,'id'); 20 21 //連貫查詢 22 $article=M('wechat_hello_article'); 23 $article->where('id=11')->delete(); 24 25 exit(); 26 break; 27 case 'index': 28 //從數據表讀取數據並賦給數組$data 29 //$data=Hello::dataList(); 30 echo '這是自適應模塊的PC端前端控制器'; 31 exit(); 32 break; 33 case 'detail': 34 $data=Hello::dataGet($id); //$id 可以改成$_GET['id'] 35 break; 36 case 'tougao': 37 38 break; 39 case 'tougaosave': 40 $info['pics']=deformat_focus_img('pics'); //多圖上傳的特殊處理,其他類型不需要 41 42 print_r($info); 43 exit(); 44 45 /* 46 $op=Hello::dataInsert($info); 47 48 if($op) 49 { 50 echo '文章投稿成功,ID為'.$op; 51 } 52 else 53 { 54 echo '文章投稿失敗'; 55 } 56 exit(); 57 */ 58 break; 59 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 60 61 //case 'index': 62 63 //在此寫 index.php?m=hello&a=index 時的邏輯 64 65 //break; 66 67 //case 'list': 68 69 //在此寫 index.php?m=hello&a=list 時的邏輯 70 71 //break; 72 73 //以此類推... 74 75 //case '...': 76 77 //在此寫 index.php?m=hello&a=... 時的邏輯 78 79 //break; 80 81 default: 82 break; 83 } 84 ?>
效果:

小貼士:
傳統操作的MySql::mysqlDelete()方法等同於連貫操作的delete()方法,用於刪除記錄。但是連貫操作更簡潔易懂。
總結:在1.1.3+版本的phpWeChat中已兼容支持這兩種MySql數據庫操作方案,您可以根據自己的喜好來定奪采取何種方式。
