返回顶部

收藏

PHP的PDO数据库操作类

更多

一个简单的PDO类封装。。仅供学习交流

PdoDb 数据库类

<?php
/**
 * @throws Error
 * PDO数据库
 */

class PdoDb extends DatabaseAbstract
{
    /**
     * PDO实例
     * @var PDO
     */
    protected $DB;
    /**
     * PDO准备语句
     * @var PDOStatement
     */
    protected $Stmt;
    /**
     * 最后的SQL语句
     * @var string
     */
    protected $Sql;
    /**
     * 配置信息 $config=array('dsn'=>xxx,'name'=>xxx,'password'=>xxx,'option'=>xxx)
     * @var array
     */
    protected $Config;

    /**
     * 构造函数
     * @param array $config
     */
    public function __construct($config)
    {
        $this->Config = $config;
    }

    /**
     * 连接数据库
     * @return void
     */
    public function connect()
    {
        $this->DB = new PDO($this->Config['dsn'], $this->Config['name'], $this->Config['password'], $this->Config['option']);
        //默认把结果序列化成stdClass
        $this->DB->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
        //自己写代码捕获Exception
        $this->DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
    }

    /**
     * 断开连接
     * @return void
     */
    public function disConnect()
    {
        $this->DB = null;
        $this->Stmt = null;
    }

    /**
     * 执行sql,返回新加入的id
     * @param string $statement
     * @return string
     */
    public function exec($statement)
    {
        if ($this->DB->exec($statement)) {
            $this->Sql = $statement;
            return $this->lastId();
        }
        $this->errorMessage();
    }

    /**
     * 查询sql
     * @param string $statement
     * @return PdoDb
     */
    public function query($statement)
    {
        $res = $this->DB->query($statement);
        if ($res) {
            $this->Stmt = $res;
            $this->Sql = $statement;
            return $this;
        }
        $this->errorMessage();
    }

    /**
     * 序列化一次数据
     * @return mixed
     */
    public function fetchOne()
    {
        return $this->Stmt->fetch();
    }

    /**
     * 序列化所有数据
     * @return array
     */
    public function fetchAll()
    {
        return $this->Stmt->fetchAll();
    }

    /**
     * 最后添加的id
     * @return string
     */
    public function lastId()
    {
        return $this->DB->lastInsertId();
    }

    /**
     * 影响的行数
     * @return int
     */
    public function affectRows()
    {
        return $this->Stmt->rowCount();
    }

    /**
     * 预备语句
     * @param string $statement
     * @return PdoDb
     */
    public function prepare($statement)
    {
        $res = $this->DB->prepare($statement);
        if ($res) {
            $this->Stmt = $res;
            $this->Sql = $statement;
            return $this;
        }
        $this->errorMessage();
    }

    /**
     * 绑定数据
     * @param array $array
     * @return PdoDb
     */
    public function bindArray($array)
    {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                //array的有效结构 array('value'=>xxx,'type'=>PDO::PARAM_XXX)
                $this->Stmt->bindValue($k + 1, $v['value'], $v['type']);
            } else {
                $this->Stmt->bindValue($k + 1, $v, PDO::PARAM_STR);
            }
        }
        return $this;
    }

    /**
     * 执行预备语句
     * @return bool
     */
    public function execute()
    {
        if ($this->Stmt->execute()) {
            return true;
        }
        $this->errorMessage();
    }

    /**
     * 开启事务
     * @return bool
     */
    public function beginTransaction()
    {
        return $this->DB->beginTransaction();
    }

    /**
     * 执行事务
     * @return bool
     */
    public function commitTransaction()
    {
        return $this->DB->commit();
    }

    /**
     * 回滚事务
     * @return bool
     */
    public function rollbackTransaction()
    {
        return $this->DB->rollBack();
    }

    /**
     * 抛出错误
     * @throws Error
     * @return void
     */
    public function errorMessage()
    {
        $msg = $this->DB->errorInfo();
        throw new Error('数据库错误:' . $msg[2]);
    }

    //---------------------
    /**
     * 单例实例
     * @var PdoDb
     */
    protected static $_instance;

    /**
     * 默认数据库
     * @static
     * @param array $config
     * @return PdoDb
     */
    public static function instance($config)
    {
        if (!self::$_instance instanceof PdoDb) {
            self::$_instance = new PdoDb($config);
            self::$_instance->connect();
        }
        return self::$_instance;
    }

    //----------------------

    /**
     * 获取PDO支持的数据库
     * @static
     * @return array
     */
    public static function getSupportDriver(){
        return PDO::getAvailableDrivers();
    }
    /**
     * 获取数据库的版本信息
     * @return array
     */
    public function getDriverVersion(){
        $name = $this->DB->getAttribute(PDO::ATTR_DRIVER_NAME);
        return array($name=>$this->DB->getAttribute(PDO::ATTR_CLIENT_VERSION));
    }

}

使用的时候

PdoDb::instance($config);

标签:php

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. ksc 发表 2014-05-09 13:41:26 php模版引擎 模版继承{extends}的简单实现
  2. lerry 发表 2011-04-08 16:42:00 在32位ubuntu server下编译带php-fpm的php
  3. hqlulu <> 发表 2017-11-10 04:20:34 CI的session功能在PHP7.1下不可用
  4. hqlulu <> 发表 2017-11-15 06:20:01 phpMyadmin设置自动连接数据库
  5. thinkpc 发表 2017-11-22 16:58:49 Curl&nbsp;PHP&nbsp;77&nbsp;错误码&nbsp;CURLE_SSL_CACE
  6. 博主 发表 2017-08-04 06:42:00 PHP 的错误和异常处理机制
  7. 博主 发表 2017-08-07 09:02:00 PHP 的数据结构扩展
  8. 博主 发表 2017-08-08 02:51:00 PHP7 安装 xhprof
  9. 博主 发表 2017-09-22 10:48:00 PHP headers already sent 原因分析
  10. Leniy 发表 2017-11-26 09:31:19 修复博客中的php notice告警
  11. admin 发表 2017-12-05 11:06:59 Linux下全局安装composer方法
  12. wwek 发表 2017-07-14 09:10:16 简单粗暴,专门解决PHP MYSQL数据库雪崩

发表评论