自制PHP框架之模型与数据库


Posted in PHP onMay 07, 2017

什么是模型?

我们的WEB系统一定会和各种数据打交道,实际开发过程中,往往一个类对应了关系数据库的一张或多张数据表,这里就会出现两个问题。

1.类和数据表,一方修改会导致另一方的修改,只要数据表结构不定下来,业务逻辑的开发几乎没法开工

2.获取数据时会牵涉很多SQL语句的拼接,如果数据结构变动,这些SQL需要改写

假如要开发一个博客系统,我们先设计两个Model和两张数据表

第一张数据表,表名是post,存储了博客文章,数据如下:

自制PHP框架之模型与数据库

第二章数据表,表名是comment,存储了博客文章的评论,数据如下:

自制PHP框架之模型与数据库

post和comment是一对多的关系,每一篇博客文章对应了多条评论,每一条评论只属于一篇文章。

Model类的设计之前,我们先定义好三个接口

interface IModel{
	public static function all();
	public static function get($id);
	public static function where($condition,$value);
}

定义Model类

class Model implements IModel{
	public static $table;
	
	public static $db;
	public function __construct(){
		self::$db=new MySQL();
	}
	
	public static function get($id){
		return self::where('id',$id);
	}
	
	public static function where($condition,$value){
		$sql=sprintf("select * from %s where %s='%s'",self::$table,$condition,$value);
		return self::$db->Query($sql);
	}

	public static function all(){
		$sql=sprintf("select * from %s",self::$table);
		return self::$db->Query($sql);
	}
}

这三个接口分别负责了三种查询:遍历查询,条件查询,按编号查询,其实这三种接口的设计并不是最科学的,甚至get方法不过是where的一种特殊形式,但是这样的设计并不影响我们工程,甚至也有助于理解,我们后期会对这段代码做改动。

之所以在Model类里就完成了SQL的拼接,就是希望在子类中不必重复再写SQL。

然后是Post类的定义

class PostModel extends Model{	
	public $postid;
	public function __construct(){
		parent::__construct();
		parent::$table='post';
	}
}

还有Comment类的定义

class CommentModel extends Model{
	public $commentid;
	public function __construct(){
		parent::__construct();
		parent::$table='comment';
	}
}

我们可以在控制器的方法中写这样的代码来完成调用数据

$post=new PostModel();
$post::all();
$arr=$post::get('1');
var_dump($arr);

$comment=new CommentModel();
$arr=$comment::get('2');
var_dump($arr);

我们发现,这样的代码很简洁,但是问题也随之而来,我们SQL查询时候,还有很多复杂的联表查询如join操作,如此,拼接SQL还是不可避免的,这个复杂的问题,我们放在后面解决。

模型与数据库

先写一个DB抽象类,规定类需要实现的方法

abstract class DB{
	
	private $IP;
	private $user;
	private $pwd;
	private $name;
	private $connection;
	
	abstract public function Execute($sql);
	abstract public function Query($sql);
}

这里以MySQL数据为例,当然你也完全可以实现一套Sqlite数据库的接口。

class MySQL extends DB{

	public function MySQL(){
		
		/*Config*/
		$this->IP='*';
		$this->ServerID='*';
		$this->ServerPassword='*';
		$this->DataBaseName='*';
		/*End of Config*/
		
		$this->connection=mysqli_connect($this->IP,$this->ServerID,$this->ServerPassword,$this->DataBaseName);
		
		if(!$this->connection){
			die('Could not connect'.$this->connection);
		}
		
		mysqli_query($this->connection,'set names utf8');
	}

	public function Execute($sql){
		return mysqli_query($this->connection,$sql);	
	}

	public function Query($sql){
		$result=mysqli_query($this->connection,$sql);
		$arr=array();
		while($row=mysqli_fetch_array($result)){
			$arr[]=$row;
		}
		return $arr;
	}
	public function Close(){
		mysqli_close($this->connection);
	}
}

谈到数据库类,上述的写法仍不是最好的,因为我们可以使用单例模式来保证DB类只有一次初始化,来节省硬件资源的开销,但这不是本节的主题,我们把设计模式放在之后来谈。 

PHP 相关文章推荐
php+dbfile开发小型留言本
Oct 09 PHP
PHP安装攻略:常见问题解答(二)
Oct 09 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
PHP中break及continue两个流程控制指令区别分析
Apr 18 PHP
php对mongodb的扩展(初出茅庐)
Nov 11 PHP
php不用正则验证真假身份证
Nov 06 PHP
跟我学Laravel之安装Laravel
Oct 15 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
php实现图片缩略图的方法
Mar 29 PHP
php实现将base64格式图片保存在指定目录的方法
Oct 13 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
PHP命名空间用法实例分析
Sep 04 PHP
自制PHP框架之路由与控制器
May 07 #PHP
PHP-CGI远程代码执行漏洞分析与防范
May 07 #PHP
PHP关键特性之命名空间实例详解
May 06 #PHP
PHP 中使用explode()函数切割字符串为数组的示例
May 06 #PHP
Thinkphp 空操作、空控制器、命名空间(详解)
May 05 #PHP
thinkPHP实现的联动菜单功能详解
May 05 #PHP
thinkPHP实现的省市区三级联动功能示例
May 05 #PHP
You might like
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
php实现socket推送技术的示例
2017/12/20 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
最新28个很棒的jQuery 教程
2011/05/28 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
Koa日志中间件封装开发详解
2019/03/09 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
Python中装饰器高级用法详解
2017/12/25 Python
python Flask 装饰器顺序问题解决
2018/08/08 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
python读文件的步骤
2019/10/08 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
西安众合通用.net笔试题
2013/03/18 面试题
《口技》教学反思
2014/02/21 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
创建青年文明号材料
2014/05/09 职场文书
预防传染病方案
2014/06/14 职场文书
未婚证明书模板
2014/10/08 职场文书
会计实训报告范文
2014/11/04 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
Python Matplotlib绘制条形图的全过程
2021/10/24 Python
一文搞懂Java中的注解和反射
2022/06/21 Java/Android