为了让框架的内容与数据分离,我们把常用的类封装到一个工具类中,当用到这些方法时,就调用这个封装好的类,能够使代码的复用性得到很大的提高。
首先,封装数据库相关操作,为了使封装规范化,我们创建一个接口让数据库实现接口中的方法,数据库使用PDO扩展访问数据。
数据库接口类
I_DAO.interface.php
<?php
interface I_DAO
{
//查询所有数据的功能
public function getAll($sql='');
// //查询一条数据
public function getRow($sql='');
// //查询一个字段的值
public function getOne($sql='');
// //执行增删改的功能
public function exec($sql='');
// (查询的时候,返回的结果数)
public function resultRows();
// //查询执行插入操作返回的主键的值
public function lastInsertId();
// //
public function query($sql='');
// //转义引号、并包裹的
public function escapeData($data='');
}
数据库工具类中,对象只能通过静态方法创建一个实例(单例模式),不能通过克隆和继承创建对象,数据库的连接信息通过数组传递到方法中,工具类中有查询所有数据方法、查询一条数据方法、获得一个字段值的方法、实现增删改方法、
返回结果数量的方法等。
数据库操作工具类
DAOPDO.class.php
<?php
class DAOPDO implements I_DAO
{
private $host;
private $dbname;
private $user;
private $pass;
private $port;
private $charset;
//该属性保存pdo对象
private $pdo;
//查询语句返回的结果集数量
private $resultRows;
//私有属性保存该该实例
private static $instance;
//私有的构造方法
private function __construct($option=array())
{
//初始化服务器的配置
$this -> initOptions($option);
//初始化PDO对象
$this -> initPDO();
}
//私有的克隆方法
private function __clone()
{
}
//公共的静态方法实例化单例对象
public static function getSingleton($options=array())
{
if(!self::$instance instanceof self){
//实例化
self::$instance = new self($options);
}
return self::$instance;
}
//初始化服务器的配置
private function initOptions($option)
{
$this -> host = isset($option['host'])?$option['host']:'';
$this -> dbname = isset($option['dbname'])?$option['dbname']:'';
$this -> user = isset($option['user'])?$option['user']:'';
$this -> pass = isset($option['pass'])?$option['pass']:'';
$this -> port = isset($option['port'])?$option['port']:'';
$this -> charset = isset($option['charset'])?$option['charset']:'';
}
//初始化PDO对象
private function initPDO()
{
$dsn =
"mysql:host=$this->host;dbname=$this->dbname;port=$this->port;charset=$this->charset";
$this -> pdo = new PDO($dsn,$this->user,$this->pass);
}
//封装pdostatement对象
public function query($sql="")
{
//返回pdo_statement对象
return $this->pdo -> query($sql);
}
//查询所有数据
public function getAll($sql='')
{
$pdo_statement = $this->query($sql);
$this->resultRows = $pdo_statement -> rowCount();
if($pdo_statement==false){
//输出SQL语句的错误信息
$error_info = $this->pdo-> errorInfo();
$err_str = "SQL语句错误,具体信息如下:<br>".$error_info[2];
echo $err_str;
return false;
}
$result = $pdo_statement -> fetchAll(PDO::FETCH_ASSOC);
return $result;
}
//查询一条记录
public function getRow($sql='')
{
$pdo_statement = $this->query($sql);
if($pdo_statement==false){
//输出SQL语句的错误信息
$error_info = $this->pdo-> errorInfo();
$err_str = "SQL语句错误,具体信息如下:<br>".$error_info[2];
echo $err_str;
return false;
}
$result = $pdo_statement -> fetch(PDO::FETCH_ASSOC);
return $result;
}
//获得一个字段的值
public function getOne($sql='')
{
$pdo_statement = $this->query($sql);
if($pdo_statement==false){
//输出SQL语句的错误信息
$error_info = $this->pdo-> errorInfo();
$err_str = "SQL语句错误,具体信息如下:<br>".$error_info[2];
echo $err_str;
return false;
}
//返回查询的字段的值,我们在执行sql语句之前就应该明确查询的是哪个字段,这样fetchColumn就已经知道查询的字段值
$result = $pdo_statement -> fetchColumn();
return $result;
}
//实现非查询的方法
public function exec($sql='')
{
$result = $this->pdo -> exec($sql);
//===为了区分 受影响的记录数是0的情况
if($result===false){
$error_info = $this->pdo-> errorInfo();
$err_str = "SQL语句错误,具体信息如下:<br>".$error_info[2];
echo $err_str;
return false;
}
return $result;
}
//查询语句返回的结果数量
public function resultRows()
{
return $this->resultRows;
}
//返回上次执行插入语句返回的主键值
public function lastInsertId()
{
return $this->pdo->lastInsertId();
}
//数据转义并引号包裹
public function escapeData($data='')
{
return $this->pdo->quote($data);
}
}