10天学会phpWeChat——第九天:数据库增、删、改、查(CRUD)操作

数据库的操作(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数据库操作方案,您可以根据自己的喜好来定夺采取何种方式。

 

 

《10天学会phpWeChat》系列教程传送门:

posted @ 2017-01-15 17:25 phpWeChat开发教程 阅读(...) 评论(...) 编辑 收藏
可直接生成文档的API调试、管理工具 phpWeChat官网 phpWeChat应用市场 phpWeChat使用文档