在第二天,我们创建了我们的第一个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 ,编写对应路由逻辑。
<?php
use wechat\hello\hello;
use phpWeChat\Area;
use phpWeChat\CaChe;
use phpWeChat\Config;
use phpWeChat\Member;
use phpWeChat\Module;
use phpWeChat\MySql;
use phpWeChat\Order;
use phpWeChat\Upload; !defined('IN_APP') && exit('Access Denied!'); switch($action)
{
case 'index':
//从数据表读取数据并赋给数组$data
$data=MySql::fetchAll("SELECT * FROM `pw_wechat_hello_article` ORDER BY `id` DESC"); break;
//以下 case 条件仅为 示例。您可以根据业务逻辑*修改和拓展 //case 'index': //在此写 index.php?m=hello&a=index 时的逻辑 //break; //case 'list': //在此写 index.php?m=hello&a=list 时的逻辑 //break; //以此类推... //case '...': //在此写 index.php?m=hello&a=... 时的逻辑 //break; default:
break;
}
?>
三、打开前端视图文件template/default/index.html ,显示数据给用户。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head> <body>
<ul>
{loop $data $r}
<li>
<h1>{$r['title']}</h1>
<p>{$r['content']}</p>
</li>
{/loop}
</ul>
</body>
</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):
<?php
// +----------------------------------------------------------------------
// | phpWeChat hello 操作类 Last modified 2016-12-28 00:02:22
// +----------------------------------------------------------------------
// | Copyright (c) 2009-2016 phpWeChat http://www.phpwechat.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: 骑马的少年 <phpwechat@126.com> <http://www.phpwechat.com>
// +----------------------------------------------------------------------
namespace wechat\Hello; use phpWeChat\Area;
use phpWeChat\CaChe;
use phpWeChat\Config;
use phpWeChat\DataInput;
use phpWeChat\DataList;
use phpWeChat\Member;
use phpWeChat\Module;
use phpWeChat\MySql;
use phpWeChat\Order;
use phpWeChat\Upload; class Hello
{
public static $mPageString=''; // 这个静态成员是系统自带,请勿删除
private static $mArticleTable='wechat_hello_article'; static public function dataList()
{
//DB_PRE常量是phpWeChat自带常量,指数据表前缀。 $data=MySql::fetchAll("SELECT * FROM `".DB_PRE.self::$mArticleTable."` ORDER BY `id` DESC"); return $data;
}
}
?>
此时,前端控制器端稍作改动:
前端控制器(index.php):
<?php
use wechat\hello\hello;
use phpWeChat\Area;
use phpWeChat\CaChe;
use phpWeChat\Config;
use phpWeChat\Member;
use phpWeChat\Module;
use phpWeChat\MySql;
use phpWeChat\Order;
use phpWeChat\Upload; !defined('IN_APP') && exit('Access Denied!'); switch($action)
{
case 'index':
//从数据表读取数据并赋给数组$data
$data=Hello::dataList(); break;
//以下 case 条件仅为 示例。您可以根据业务逻辑*修改和拓展 //case 'index': //在此写 index.php?m=hello&a=index 时的逻辑 //break; //case 'list': //在此写 index.php?m=hello&a=list 时的逻辑 //break; //以此类推... //case '...': //在此写 index.php?m=hello&a=... 时的逻辑 //break; default:
break;
}
?>
访问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'); |