「七天自制PHP框架」第二天:模型与数据库

往期回顾:「七天自制PHP框架」第一天:路由与控制器,点击此处

什么是模型?

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

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

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

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

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

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

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

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


1

2

3

4

5


interface IModel{

    public static function all();

    public static function get($id);

    public static function where($condition,$value);

}

定义Model类


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22


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类的定义


1

2

3

4

5

6

7


class PostModel extends Model{ 

    public $postid;

    public function __construct(){

        parent::__construct();

        parent::$table=‘post‘;

    }

}

还有Comment类的定义


1

2

3

4

5

6

7


class CommentModel extends Model{

    public $commentid;

    public function __construct(){

        parent::__construct();

        parent::$table=‘comment‘;

    }

}

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


1

2

3

4

5

6

7

8


$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抽象类,规定类需要实现的方法


1

2

3

4

5

6

7

8

9

10

11


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数据库的接口。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36


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类只有一次初始化,来节省硬件资源的开销,但这不是本节的主题,我们把设计模式放在之后来谈。 

时间: 2024-10-24 13:59:15

「七天自制PHP框架」第二天:模型与数据库的相关文章

「七天自制PHP框架」第三天:PHP实现的设计模式

往期回顾:「七天自制PHP框架」第二天:模型与数据库,点击此处 原文地址:http://www.cnblogs.com/sweng/p/6624845.html,欢迎关注:编程老头 为什么要使用设计模式? 设计模式,我的理解是为了达到"可复用"这个目标,而设计的一套相互协作的类. 感兴趣的读者可以阅读<Design Patterns: Elements of Reusable Object-Oriented Software>,四位作者(Gang of Four)在书中列举

「七天自制PHP框架」第一天:路由与控制器

我们为什么要使用路由? 原因1:一个更漂亮的URI 1.URI的改进 刚刚开始学PHP时,我们一定写过blog.php?id=1之类的URI,使用GET方式获取参数.这样的URI有两个缺点,一是容易被SQL注射攻击,二是维护性可读性差,大家可以比较下面两种URI哪一种更具备可读性. www.mysite.com/blog.php?id=1 上面URI是我们初学PHP最常用的. www.mysite.com/blog/1 这种URI是目前最流行的URI,举个例子,比如很多读书类,电影类网站,都使用

「C语言回顾之旅」第二篇:指针详解进阶

说明: 第一篇回顾了指针的基本概念以及基本使用,因此对指针也有了一个较为清晰的思路,但实际上第一篇关于指针的内容是不太容易忘记的.这是第二篇中的内容是比较容易混淆,但对于指针的进一步学习也是非常重要的. 一.指向函数的指针 1.函数指针 ·函数指针即指向函数的指针,函数指针值为函数的入口地址,通过使用该指针,即可以使用该函数: ·编写一个程序返回两个数的最大值,通过函数指针调用函数: a.main函数代码如下: #include<stdio.h> int max(int *, int *);

排球计分(七)—— 使用EF框架,创建Controller,生成数据库

在使用EF框架之前,我们需要写好模型类.然后在创建controller. 在之前的博客中,我们已经设计,和完成了模型类,这时候 我们只需把代码拿过来就可以使用了. Balls.cs namespace 排球计分程序.Models    {        public class Ball        {            public int ID { get; set; }            public string XingMing { get; set; }          

SAP 携合作伙伴建立「工业4.0开放联盟」

开放式生态系统推动工业制造工厂的数字化转型▲▲▲? 联盟支持开放式生态系统,采用「工业4.0开放联盟框架」实现互操作性 ? 开放.互操作的合作方法将为不同规模的企业提供发展良机 ? 工业 4.0 开放联盟旨在让智慧工厂内 80% 的机器都采用统一标准 在2019汉诺威工业博览会上,SAP 联合6家欧洲机械工程.工业自动化和软件行业的企业倍福 (Beckhoff).恩德斯豪斯(Endress+Hauser).赫优讯 (Hilscher).易福门(ifm).库卡 (KUKA)及莫迪维克(Multiv

谈谈「七个好习惯」

<高效能人士的七个习惯>The Seven Habits of Highly Effective People是美国管理大师史蒂芬·柯维的1989年的著作.风靡企业界,号称「世界500强企业必备培训课程」. 台达(之前工作的公司)的CEO日理万机,但每年还是会抽时间从台北飞到东莞给员工上这堂培训课,可见是这本书并不是普通的「鸡汤」. 对习惯2 -「以终为始」的曲折理解 最开始的印象是在台达厂房内的楼梯——有些楼层的楼梯,中间七级,每级用一块不锈钢板钉着一个「习惯」,这样在上楼梯的时候会不自觉看

「Mobile Testing Summit China 2016」 中国移动互联网测试大会-议题征集

时至北京盛夏,一场由 TesterHome 主办的关于移动互联网测试技术的盛会正在紧锣密鼓的筹备中.只要你关注软件质量,热爱测试,期待学习,都欢迎你加入这次移动测试技术大会中和我们一起分享经验.探讨话题,结识业界朋友. 「Mobile Testing Summit China 2016」中国移动互联网测试大会 大会定位:专注移动互联网测试技术的分享会,关注移动互联网质量的有志之士的集会. 大会主旨:秉承着务实.能落地.有深度.高质量.重分享的原则与广大测试工程师做最新最实用的分享与交流,以推广新

「视频直播技术详解」系列之四:推流和传输

关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 在上一期中,我们介绍了讲解编码和封装. 本篇是<解密视频直播技术>系列之四:推流和传输.推流是直播的第一公里,直播的推流对这个直播链路影响非常大,如果推流的网络不稳定,无论我们如何做优化,观众的体验都会很糟糕.所以也是我们排查问题的第一步,如何系统地解决这类问题需要我们对相关理论有基础的认识. 本系列文章大纲如下: (一

【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,前篇(1)

http://www.4gamer.net/games/216/G021678/20140703095/ 新连载「实验做出的游戏图形」,是聚焦在特定游戏的图形上, 对它的结构和使用的技术解说为主旨.之前笔者连载的「西川善司的3D游戏入迷」,覆盖范围都很广,而与特定游戏强关联的技术解说,会在今后的新连载中处理. 作为纪念的第一回选择的,是Arc System Works开发的,2014年2月在街机上运作的格斗游戏「GUILTY GEAR Xrd -SIGN-」 全3D图形的GUILTY GEAR