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: 骑马的少年 <[email protected]> <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‘);

时间: 2024-10-12 21:27:31

10天学会phpWeChat——第三天:从数据库读取数据到视图的相关文章

10天学会phpWeChat——第十天:phpWeChat的会员注册、登录以及微信网页开发

通过前面的系列教程,我们系统的讲解了phpWeChat从视图端.控制器端到模型端的操作流程:熟悉了phpWeChat的目录结构:掌握了视图端模板如何创建一个丰富的表单和模型端如何操作数据库.这一切都是传统Web以及现代H5开发的核心. 我们今天进行<10天学会phpWeChat>教程的最后一讲,phpWeChat的微信网页开发.在这一讲里,我们将重点讲解在微信网页开发中几个常见参数的获取和一个微信扫一扫的实例. 一.微信网页开发中的几个重要参数(文档参考:https://mp.weixin.q

10天学会phpWeChat——第八天:Form类,丰富表单提交的字段类型

通过前面七讲的系列教程,我们完成了一个包含后台并自适应PC+h5移动端的文章管理模块. 在实际的生产环境中,文章投稿.商品上传等操作并不会简单局限于一个text和textarea组成的表单.在实际中,我们可能会用到web富文本编辑器(如ueditor.markdown).图片上传.多图上传.附件上传.地图标注等更加丰富的表单类型. 今天,我们开始<10天学会phpWeChat>的第八讲:Form类,丰富表单提交的字段类型. 一.什么是Form类? Form类是phpWeChat封装好的一个类,

10天学会phpWeChat——第二天:hello world!我的第一个功能模块

今天我们开始进入<10天学会phpWeChat>系列教程的第二天:创建我的第一个hello world! 功能模块. 1.登录后台,进入 系统设置--自定义模块,如图: 自定义模块参数说明: 上级模块:上级模块一共三个选项:会员member (一般很少会在其下面建立模块).pc电脑端(建立Pc访问的官网.单页.商城模块等).wechat微信公共号端(建立微信公共号端访问的微官网.微资讯.微商城等) 这里我们可以根据实际需求选择,此处示例我们选择wechat. 模块名称:模块的中文名称,命名没特

10天学会phpWeChat——第五天:实现新闻投稿功能

在前几讲里,我们逐渐实现了自己小模块的新闻列表展示.新闻详情展示功能,现在您已经初步有能力开发一个phpWeChat小模块了,本文将在已开发的hello world模块基础上,增加一个新的功能--新闻投稿. 今天我们进入<10天学会phpWeChat>系列教程的第五天:实现新闻投稿功能,通过今天的学习,希望大家对phpWeChat的表单提交.数据入库有个清晰的认识. 我们定义,投稿的链接为:http://www.example.com/index.php?m=hello&a=touga

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

数据库的操作(CRUD)是一个现代化计算机软件的核心,尤其针对web应用软件.虽然在前面的几讲里,我们针对数据库操作大致有了一些了解,但今天我们需要再次强化下. 除了新瓶装老酒,我们今天还引入一个新的数据库操作方法:连贯操作. 今天讲解的内容是基于phpWeChat核心框架1.1.3版本, 下载地址:http://s.phpwechat.com/app_38026ed22fc1a91d92b5d2ef93540f20 框架更新:http://bbs.phpwechat.com/forum-2-1

关于oracle数据库读取数据的三种方式

打开oracle sqldeveloper,连接到HR模式下的数据库,在SQL工作表中,执行如下语句: CREATE TABLE WANG( Name  varchar2(6), ID     number        ); 然后向表中插入如下语句: INSERT INTO WANG VALUES('WANG',1): INSERT INTO WANG VALUES('CHENG',2); INSERT INTO WANG VALUES('ZHOU',3); INSERT INTO WANG 

实验三:将读取数据功能从Repository中分离

先理解下面这段话之后再开始做实验 经过实验二的改造之后,我们代码有一点结构的概念了: Listing.aspx:向Repository要Products,然后将得到的Products在页面中显示出来. Repository:负责从数据库中读取数据,并将数据转换成对象集合. 代码结构的改造之路还没完,请看下面的情况. 如果数据库中多了一张表:订单表(Orders).订单表中的所有订单当然也需要读出来显示在页面上.参考读取产品的做法,我们需要在Repository中增加一个像Products类似的属

10分钟学会基于ASP.NET的 JQuery实例 (转)

本文介绍如何在ASP.NET(ASP.NET/AJAX)里使用基于JQuery的AJAX技术.(源代码下载见最后) 在使用JQuery前,请到www.jquery.com下载最新版本的js代码,然后再代码里使用 <script src="_scripts/jQuery-1.2.6.js" type="text/javascript"></script>即可,当然,由于微软已经把JQuery集成到VS里,所以你可以到WWW.ASP.NET/aj

张高兴的 Windows 10 IoT 开发笔记:三轴数字罗盘 HMC5883L

原文:张高兴的 Windows 10 IoT 开发笔记:三轴数字罗盘 HMC5883L 注意,数据不包含校验,准确的来说我不知道怎么校验,但方向看起来差不多是对的... GitHub:https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/HMC5883L