# 一、php封装pdo操作类 ## 为什么使用PDO? 简单粗暴啊,不同数据库,只需要更改下数据库连接方式即可,通俗来说,就是万金油! 而且PDO更安全! 具体和其它操作数据库的扩展的不同,可以去查询 # 一.如何安装PDO连接数据库 PDO从PHP5.1开始,就携带了此扩展,如果你的PHP不支持,请升级到5.1或者更高版本 开启方式:找到php.ini 如果你的php版本<5.3 你需要加入以下内容: `extension=php_pdo.dll` 如果你的PHP版本>=5.3 你只需要在配置文件加入以下内容: 如果你操作的是其它数据库,请选择其它扩展 如果你的页面存在此内容,请删除其前面的 ; 以打开此扩展 此时,重启你的PHP即可! 如果你使用的是本教程推荐的phpstudy,你可以更简单的开启pdo扩展 选择其它选项->PHP扩展及设置->PHP扩展->如果已经打钩说明已经开启,否则点击此扩展,然后点击重启即可 # 二.PDO如何连接数据库 我们直接来看个例子 ``` $db = new PDO("mysql:host=localhost;dbname=myblog","root","root"); var_dump($db); $res = $db->query('select * from od_admin '); $res = $res->fetchAll(PDO::FETCH_ASSOC); echo ""; print_r($res); echo ""; exit; ``` #### 注意,请自行在数据库myblog中的admin表添加数据 我们可以看到,他输出了三条数据,这三条数据是我刚才加入的数据 这样,表示我们已经成功连接到数据库,并且执行了简单的sql语句,我们来分析下 ``` $db = new PDO("mysql:host=localhost;dbname=myblog","root","root"); ``` 这里的localhost就是我们的数据库地址,也可以写作 127.0.0.1 dbname 就填写你的数据库名词 最后面两个参数是账号 密码,根据你实际情况填写即可! ``` $db->query('select * from od_admin '); ``` $db,就是我们刚才实例化的PDO类的对象,query就是PDO底层给我提供的执行sql语句的方法 这句就是查询所有admin表下的数据 ``` $res = $res->fetchAll(PDO::FETCH_ASSOC); ``` 这句的意思就是说将返回所有的数据以数组的方式返回,并且如果不加 FETCH\_ASSOC , 返回的数据是字段为一个元素,值为一个元素, # 三.封装PDO操作类 (这才是重点) 我们开发中,并不需要每次都去连接数据库进行操作,而且我们想使用一些便捷的查询语句,而不是 每次都去写sql语句怎么办? 我们可以封装成一个数据库操作类,每次使用的时候实例化他即可! ①.我们先写一个名字叫做DbDriver.php的脚本 ②.我们说过,类的关键词是class, 并且+类名和花括号,所以,你应该有一下代码 ``` <?php class DbDriver { } ``` ③.接下来我们开始分析如何去写这个类 首先呢,连接数据库,肯定要有数据库地址,账号密码等,所以我们申明一个属性,叫做config ``` protected $config; ``` 我们连接数据库成功,肯定还要有一个属性去接受数据库连接成功后返回对象 ``` private $pdo; ``` 接下来我们写连接的方法 我们在写这种工具类的时候,一般情况下,最好是实例化好这个类的时候,就可以使用了 所以,我们在构造方法里去写数据库连接 ``` function __construct($config) { //判断这个属性是否为空,为空则去实例化,否则直接返回 if(is_null($this->pdo)){ //把传递过来配置文件传递赋给属性 $this->config = $config; $dsn = 'mysql:dbname=' . $this->config["DBNAME"] . ';host=' . $this->config["HOST"] . ''; try { //设置输出编码为UTF8 $this->pdo = new PDO($dsn, $this->config["USER"], $this->config["PWD"], array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" )); //设置 ATTR_ERRMODE 的值为ERRMODE_EXCEPTION(抛出异常) $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //这是值取消 PHP本地模拟prepare,也就是会把参数和sql发送给数据库去进行转义处理[防注入] $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); } catch (PDOException $e) { //这两个方法是PDO提供的,一个是获取错误内容,一个是错误位置 throw new PDOException($e->getMessage(), $e->getCode()); } }else{ return $this->pdo; } } ``` 这也,我们就在实例化的时候实例化好了数据库操作类! 下面封装了一些常用的sql操作方法 ### 大家可以直接使用 ### 大家可以直接使用 ### 大家可以直接使用 ``` <?php namespace Db; use PDOException; use PDO; /** * Created by PhpStorm. * User: Wei * Date: 2017/5/22 * Time: 9:12 */ class DbDriver extends PDOException { protected $config; private $pdo; public $lastSql = ''; /** * 事务开启状态 * @var */ public $Transactions = false; function __construct() { if(empty($this->pdo)){ include_once "../../Lib/function.php"; $config = load_config('../../Config/config.php'); $this->config = $config; $dsn = 'mysql:dbname=' . $this->config["DBNAME"] . ';host=' . $this->config["HOST"] . ''; try { $this->pdo = new PDO($dsn, $this->config["USER"], $this->config["PWD"], array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" )); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $this->bConnected = true; } catch (PDOException $e) { throw new PDOException($e->getMessage(), $e->getCode()); } }else{ return $this->pdo; } } /** * 关闭链接 */ public function closeConnect() { $this->pdo = null; } /** * 转义字符串 * @param $string * @return bool * @throws Exception */ public function escapeString($string) { //参数分析 if (!$string) { throw new Exception('$string parameter is null'); } $_quoteString = $this->pdo->quote($string); if ($_quoteString === false) { throw new Exception('the driver does not support quoting in this way'); } else { return $_quoteString; } } /** * 获取数据库错误信息 * @return mixed */ public function errorMsg() { $info = $this->pdo->errorInfo(); return $info[2]; } /** * 获取数据库错误信息代码 * * @access public * @return int */ public function errorNum() { return $this->pdo->errorCode(); } /** * 得到插入id * @return string */ public function lastInsertId() { return $this->pdo->lastInsertId(); } /** * 得到最近执行的一条sql语句 * @return string */ public function getLastSql() { return $this->lastSql; } /** * 开始事务 * @return bool */ public function startTrans() { if ($this->Transactions == false) { $this->pdo->beginTransaction(); $this->Transactions = true; } return true; } /** * 提交事务 * @return bool */ public function commit() { if ($this->Transactions == true) { if ($this->pdo->commit()) { $this->Transactions = false; } } return true; } /** * 事务回滚 */ public function rollback() { if ($this->Transactions == true) { if ($this->pdo->rollBack()) { $this->Transactions = false; } } } /** * @param $sql * @return PDOStatement * @throws Exception|boolean */ public function query($sql) { if (!$sql) { throw new Exception('sql parameter is null'); } $this->lastSql = $sql; $result = $this->pdo->query($sql);//返回 true or false return $result->fetch(PDO::FETCH_ASSOC);; } /** * 返回执行sql后影响的行数 * @param $sql * @return int * @throws Exception */ public function exec($sql) { if (!$sql) { throw new Exception('sql parameter is null'); } $this->lastSql = $sql; $result = $this->pdo->exec($sql); return $result; } public function getRow($sql) { if (!$sql) { throw new Exception('sql parameter is null'); } $this->lastSql = $sql; $result = $this->pdo->query($sql); if ($result === false) { throw new Exception('sql execute failed ' . $this->getLastSql()); } $row = $result->fetch(PDO::FETCH_ASSOC); $result = null; return $row; } public function getAll($sql) { if (!$sql) { throw new Exception('sql parameter is null'); } $this->lastSql = $sql; $result = $this->pdo->query($sql); if ($result === false) { throw new Exception('sql execute failed ' . $this->getLastSql()); } return $result->fetchAll(PDO::FETCH_ASSOC); } /** * @param $table * @param $arr_data * @return bool * @throws Exception */ public function insert($table, $arr_data) { if (!$table || !$arr_data) { throw new Exception('table name and arr_data are null'); } $keys_arr = []; $values_arr = []; $replace_values = []; foreach ($arr_data as $key => $value) { $keys_arr[] = '`' . $key . '`'; $values_arr[] = ':' . $key; $replace_values[':' . $key] = $value; } $keys_str = implode(',', $keys_arr); $values_str = implode(',', $values_arr); $sql = sprintf('insert into `%s` (%s) values (%s)', $table, $keys_str, $values_str); $this->lastSql = $sql; $statement = $this->pdo->prepare($sql); return $statement->execute($replace_values); } public function delete($table, $sql_where) { if (!$table || !$sql_where) { throw new Exception('table name and sql_where are null'); } $sql = sprintf('delete from `%s` where %s', $table, $sql_where); $this->lastSql = $sql; $result = $this->pdo->exec($sql); if ($result === false) { throw new Exception('sql execute failed ' . $this->getLastSql()); } return $result; } public function update($table, $set, $sql_where) { if (!$table || !$sql_where) { throw new Exception('table name and sql_where are null'); } $sql = sprintf('update `%s` %s %s', $table, $set, $sql_where); $this->lastSql = $sql; $result = $this->pdo->exec($sql); if ($result === false) { throw new Exception('sql execute failed ' . $this->getLastSql()); } return $result; } public function select($fields = '*', $table, $sql_where) { $fields_str = "*"; $fields_arr = []; $temp = []; if ($fields != '*' && !empty($fields)) { $fields_arr = explode(',', $fields); foreach ($fields_arr as $k => $v) { $temp[] = '`' . $v . '`'; } $fields_str = implode(',', $temp); }else{ $fields_arr = "*"; } if(!empty($sql_where)){ $sql = sprintf('select %s from %s where %s ', $fields_str, $table, $sql_where); }else{ $sql = sprintf('select %s from ', $fields_str, $table); } $this->lastSql = $sql; $result = $this->pdo->query($sql); if ($result === false) { throw new Exception('sql execute failed ' . $this->getLastSql()); } return $this->fetch($result); } protected function fetch($result){ return $result->fetchAll(PDO::FETCH_ASSOC); } } ``` 下面贴出来如何调用这个类 ``` include "DbDriver.php"; $config = array( //'配置项'=>'配置值' 'TYPE'=>'mysql', 'HOST'=>'127.0.0.1', 'DBNAME'=>'myblog', 'USER'=>'root', 'PWD'=>'root', 'PORT'=>'3306', ); $pdo = new DbDriver($config); $res = $pdo->select("id",'admin',''); echo $pdo->errorInfo(); var_dump($res);die; ```