开发自己的框架——(二)数据库工具类的封装

为了让框架的内容与数据分离,我们把常用的类封装到一个工具类中,当用到这些方法时,就调用这个封装好的类,能够使代码的复用性得到很大的提高。
首先,封装数据库相关操作,为了使封装规范化,我们创建一个接口让数据库实现接口中的方法,数据库使用PDO扩展访问数据。
数据库接口类
I_DAO.interface.php

 1 <?php
 2 interface I_DAO
 3 {
 4         //查询所有数据的功能
 5         public function getAll($sql='');
 6 //    //查询一条数据
 7         public function getRow($sql='');
 8 //    //查询一个字段的值
 9         public function getOne($sql='');
10 //    //执行增删改的功能
11         public function exec($sql='');
12 //    (查询的时候,返回的结果数)
13         public function resultRows();
14 //    //查询执行插入操作返回的主键的值
15         public function lastInsertId();
16 //    //
17         public function query($sql='');
18 //    //转义引号、并包裹的
19         public function escapeData($data='');
20 }

数据库工具类中,对象只能通过静态方法创建一个实例(单例模式),不能通过克隆和继承创建对象,数据库的连接信息通过数组传递到方法中,工具类中有查询所有数据方法、查询一条数据方法、获得一个字段值的方法、实现增删改方法、
返回结果数量的方法等。
数据库操作工具类
DAOPDO.class.php

  1 <?php
  2 
  3 class DAOPDO implements I_DAO
  4 {    
  5     private $host;
  6     private $dbname;
  7     private $user;
  8     private $pass;
  9     private $port;
 10     private $charset;
 11     
 12     //该属性保存pdo对象
 13     private $pdo;
 14     
 15     //查询语句返回的结果集数量
 16     private $resultRows;
 17     
 18     //私有属性保存该该实例
 19     private static $instance;
 20     //私有的构造方法
 21     private function __construct($option=array())
 22     {
 23         //初始化服务器的配置
 24         $this -> initOptions($option);
 25         //初始化PDO对象
 26         $this -> initPDO();
 27     }
 28     //私有的克隆方法
 29     private function __clone()
 30     {
 31         
 32     }
 33     //公共的静态方法实例化单例对象
 34     public static function getSingleton($options=array())
 35     {
 36         if(!self::$instance instanceof self){
 37             //实例化
 38             self::$instance = new self($options);
 39         }
 40         return self::$instance;
 41     }
 42     //初始化服务器的配置
 43     private function initOptions($option)
 44     {
 45         $this -> host = isset($option['host'])?$option['host']:'';
 46         $this -> dbname = isset($option['dbname'])?$option['dbname']:'';
 47         $this -> user = isset($option['user'])?$option['user']:'';
 48         $this -> pass = isset($option['pass'])?$option['pass']:'';
 49         $this -> port = isset($option['port'])?$option['port']:'';
 50         $this -> charset = isset($option['charset'])?$option['charset']:'';
 51     }
 52     //初始化PDO对象
 53     private function initPDO()
 54     {
 55         $dsn = 
 56         "mysql:host=$this->host;dbname=$this->dbname;port=$this->port;charset=$this->charset";
 57         $this -> pdo = new PDO($dsn,$this->user,$this->pass);
 58     }
 59     //封装pdostatement对象
 60     public function query($sql="")
 61     {    
 62         //返回pdo_statement对象
 63         return $this->pdo -> query($sql);
 64     }
 65     //查询所有数据
 66     public function getAll($sql='')
 67     {
 68         $pdo_statement = $this->query($sql);
 69         $this->resultRows = $pdo_statement -> rowCount();
 70         if($pdo_statement==false){
 71             //输出SQL语句的错误信息
 72             $error_info = $this->pdo-> errorInfo();
 73             $err_str = "SQL语句错误,具体信息如下:<br>".$error_info[2];
 74             echo $err_str;
 75             return false;
 76         }
 77         $result = $pdo_statement -> fetchAll(PDO::FETCH_ASSOC);
 78         return $result;
 79     }
 80     //查询一条记录
 81     public function getRow($sql='')
 82     {
 83         $pdo_statement = $this->query($sql);
 84         if($pdo_statement==false){
 85             //输出SQL语句的错误信息
 86             $error_info = $this->pdo-> errorInfo();
 87             $err_str = "SQL语句错误,具体信息如下:<br>".$error_info[2];
 88             echo $err_str;
 89             return false;
 90         }
 91         $result = $pdo_statement -> fetch(PDO::FETCH_ASSOC);
 92         return $result;
 93     }
 94     //获得一个字段的值
 95     public function getOne($sql='')
 96     {
 97         $pdo_statement = $this->query($sql);
 98         if($pdo_statement==false){
 99             //输出SQL语句的错误信息
100             $error_info = $this->pdo-> errorInfo();
101             $err_str = "SQL语句错误,具体信息如下:<br>".$error_info[2];
102             echo $err_str;
103             return false;
104         }
105         //返回查询的字段的值,我们在执行sql语句之前就应该明确查询的是哪个字段,这样fetchColumn就已经知道查询的字段值
106         $result = $pdo_statement -> fetchColumn();
107         return $result;
108     }
109     //实现非查询的方法
110     public function exec($sql='')
111     {
112         $result = $this->pdo -> exec($sql);
113         //===为了区分 受影响的记录数是0的情况
114         if($result===false){
115             $error_info = $this->pdo-> errorInfo();
116             $err_str = "SQL语句错误,具体信息如下:<br>".$error_info[2];
117             echo $err_str;
118             return false;
119         }
120         return $result;
121     }
122     //查询语句返回的结果数量
123     public function resultRows()
124     {
125         return $this->resultRows;
126     }
127     //返回上次执行插入语句返回的主键值
128     public function lastInsertId()
129     {
130         return $this->pdo->lastInsertId();
131     }
132     //数据转义并引号包裹
133     public function escapeData($data='')
134     {
135         return $this->pdo->quote($data);
136     }
137 }

 

posted @ 2016-09-02 01:25  小码农薛尧  阅读(999)  评论(0编辑  收藏  举报
薛尧的博客