pdo封装类

来源:互联网 发布:网络用语103是啥意思 编辑:程序博客网 时间:2024/05/20 06:31
<?php
/**
 * PDO数据库
 * @copyright By GOOGLE
 */


class pdo_db
{
    /**
     * 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);
        $this->_db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        //自己写代码捕获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 pdo_db
     */
    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 pdo_db
     */
    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 pdo_db
     */
    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()
   {
return;
        $msg = $this->_db->errorInfo();
        throw new Exception('数据库错误:' . $msg[2]);
    }


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


    /**
     * 默认数据库
     * @static
     * @param array $config
     * @return pdo_db
     */
    public static function instance($config)
   {
        if (!self::$_instance instanceof pdo_db){
            self::$_instance = new pdo_db($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));
    }


}
原创粉丝点击