自制PHP框架之模型与数据库
php  /  管理员 发布于 7年前   271
什么是模型? 我们的WEB系统一定会和各种数据打交道,实际开发过程中,往往一个类对应了关系数据库的一张或多张数据表,这里就会出现两个问题。 1.类和数据表,一方修改会导致另一方的修改,只要数据表结构不定下来,业务逻辑的开发几乎没法开工 2.获取数据时会牵涉很多SQL语句的拼接,如果数据结构变动,这些SQL需要改写 假如要开发一个博客系统,我们先设计两个Model和两张数据表 第一张数据表,表名是post,存储了博客文章,数据如下: 第二章数据表,表名是comment,存储了博客文章的评论,数据如下: post和comment是一对多的关系,每一篇博客文章对应了多条评论,每一条评论只属于一篇文章。 Model类的设计之前,我们先定义好三个接口 定义Model类 这三个接口分别负责了三种查询:遍历查询,条件查询,按编号查询,其实这三种接口的设计并不是最科学的,甚至get方法不过是where的一种特殊形式,但是这样的设计并不影响我们工程,甚至也有助于理解,我们后期会对这段代码做改动。 之所以在Model类里就完成了SQL的拼接,就是希望在子类中不必重复再写SQL。 然后是Post类的定义 还有Comment类的定义 我们可以在控制器的方法中写这样的代码来完成调用数据 我们发现,这样的代码很简洁,但是问题也随之而来,我们SQL查询时候,还有很多复杂的联表查询如join操作,如此,拼接SQL还是不可避免的,这个复杂的问题,我们放在后面解决。 模型与数据库 先写一个DB抽象类,规定类需要实现的方法 这里以MySQL数据为例,当然你也完全可以实现一套Sqlite数据库的接口。 谈到数据库类,上述的写法仍不是最好的,因为我们可以使用单例模式来保证DB类只有一次初始化,来节省硬件资源的开销,但这不是本节的主题,我们把设计模式放在之后来谈。 interface IModel{public static function all();public static function get($id);public static function where($condition,$value);}
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);}}
class PostModel extends Model{public $postid;public function __construct(){parent::__construct();parent::$table='post';}}
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);
abstract class DB{private $IP;private $user;private $pwd;private $name;private $connection;abstract public function Execute($sql);abstract public function Query($sql);}
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);}}
您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号