zoukankan      html  css  js  c++  java
  • 封装:PDO与MySQL之间的无缝切换

    以下的例子是将MySQL和PDO封装好,再无缝切换:

    文件目录:

    config.php文件:

     

    <?php
    
    return array(
        // 数据库配置
        'DB' => array(
            'default_extension'=>'mysql', //这里可以是pdo或mysql
        ),
        // 分页配置
        // 上传配置
        // 图像处理配置
    );

    I_DB.interface.php文件:

    <?php
    /**
     * 数据库接口
     */
    interface I_DB {
        public static function getInstance($config);// 获取单例对象
        public function my_query($sql); //执行增删改
        public function fetchAll($sql); //查询所有
        public function fetchRow($sql); //查询一行
        public function fetchColumn($sql); //查询一个单行单列的一个值
    }

    MySQLDB.class.php文件:

    <?php
    header('content-type:text/html;charset=utf-8');
    /**
     * MySQL数据库工具类
     */
    //加载接口
    include './I_DB.interface.php';
    class MySQLDB implements I_DB{
        private $host;   //主机地址
        private $port;     //端口号
        private $user;     //用户名
        private $pass;     //密码
        private $dbname; //数据库名
        private $charset;//字符集
        private $link;      //保存连接数据库资源
        private static $instance = null;     //单例模式中的$MySQLDB对象
    
        /**
        *@param array $config 配置文件
        */
        private function __construct ($config) {
        
            // 初始化属性的值
            $this->init($config);
            // 连接数据库
            $this->my_connect();
            // 设置字符集
            $this->my_charset();
            // 选择数据库
            $this->my_dbname();
        }
    
    
        /**
        * 只能new一次,单例模式
        *@param array $config 传递给构造方法的数组参数
        */
        public static function getInstance($config) {
            if (self::$instance == null) {
                self::$instance = new self($config);
            }
            return self::$instance;
        }
    
        /***
        *私有化克隆魔术方法
        */
        private function _clone() {}
    
        /**
        *初始化
        *@param array $config 传递给初始化方法的数组参数
        */
        private function init($config) {
            $this->host = isset($config['host'])?$config['host']:'localhost';
            $this->port = isset($config['port'])?$config['port']:'3306';
            $this->user = isset($config['user'])?$config['user']:'root';
            $this->pass = isset($config['pass'])?$config['pass']:'';
            $this->dbname = isset($config['dbname'])?$config['dbname']:'';
            $this->charset = isset($config['charset'])?$config['charset']:'utf8';
        }
    
        /**
        *错误测试方法
        *@param string $sql sql语句
        *直接用途:用来增删改
        */
        public function my_query($sql) {
            if ($result = mysql_query($sql)) {
                return $result;
            }else {
                echo "执行sql语句失败;<br/>";
                echo "错误代码:",mysql_errno(),"<br/>";
                echo "错误信息:",mysql_error(),'<br/>';
                return false;
            }
        }
        /**
        *连接数据库
        */
        private function my_connect() {
            if ($link = mysql_connect("$this->host:$this->port",$this->user,$this->pass)) {
                $this->link = $link;
            }else {
                echo "连接数据库失败:<br/>";
                echo "错误代码:",mysql_errno(),"<br/>";
                echo "错误信息:",mysql_error(),'<br/>';
                return false;
            }
        }    
    
        /**
        *设置字符集
        */
        private function my_charset() {
            $sql = "set names $this->charset";
            $this->my_query($sql);
        }
        /**
        *选择数据库
        */
        private function my_dbname() {
            $sql = "use $this->dbname";
            return $this->my_query($sql);
        }
    
    
    
        /** 
         *返回多行多列的结果集,二维数组
         *@param string sql语句
         *@return mixed(array|false) *执行成功返回数组,失败返回false
         */
        public function fetchAll($sql) {
            if($result = $this->my_query($sql)) {
                //返回资源结果集,遍历
                $rows[] = '';
                while ($row = mysql_fetch_assoc($result)) {
                    $rows[] = $row;
                }
                //结果集使用完毕,主动释放
                mysql_free_result($result);
                //返回二维数组
                return $rows;
            } else {
                return false;
            }
            
        }
     
    
        /**
        * 返回一行多列的结果集,一维数组
        *@param string 一条sql语句
        *@return mixed(array|false) 执行成功返回数组,失败返回false
         */
        public function fetchRow($sql) {
            if($result = $this->my_query($sql)) {
                //返回资源结果集,遍历
                $row = mysql_fetch_assoc($result);
                //结果集使用完毕,主动释放
                mysql_free_result($result);
                //返回一维数组
                return $row;
            } else {
                return false;
            }
        }
    
        /**
         *返回一行一列的结果集,单一值
         *@param string 一条sql语句
         *@return mixed(array|false) 执行成功返回数组,失败返回false
         */
        public function fetchColumn($sql) {
            if($result = $this->my_query($sql)) {
                //返回资源结果集,提取
                $row = mysql_fetch_row($result);
                //结果集使用完毕,主动释放
                mysql_free_result($result);
                //返回单一值
                return isset($row[0])?$row[0]:false;
            } else {
                return false;
            }
        }
        
        
    
        /**
        *析构方法
        */
        public function __destruct() {
            @mysql_close($this->link); 
        }
        /**
        *__sleep 序列化对象的时候触发执行
        */
        public function __sleep() {
            return array('host','port','user','pass','charset','dbname') ;
        }
    
    
        /**
        *__wakeup 反序列化的时候触发执行
        *初始化操作
        */
    
        public function __wakeup() {
             //初始化操作
             // 连接数据库
             $this->my_connect();
             // 设置字符集
             $this->my_charset();
             // 选择数据库
             $this->my_dbname();
         }
    
    
        /**
        *__set 为一个不可访问的属性赋值的时候自动触发
        *@param string $name 属性名
        *@param mixed $value 属性值
        */
         public function __set($name,$value) {
             $allow_set = array('host','port','user','pass','dbname','charset');
             if(in_array($name,$allow_set)) {
                 //当前属性可以被赋值
                 $this->$name = $value;
             }
         }
    
        /**
        *__get *获得一个不可访问的属性的值的时候自动触发
        *@param string $name 属性名
        */
         public function __get($name) {
             $allow_get = array('host','port','user','pass','dbname','charset');
             if (in_array($name,$allow_get)) {
                 return $this->$name;
             }
         }
    
        /**
        *__call 访问一个不可访问的对象方法的时候触发
        *@param string $name
        *@param array $argument 参数列表
        */
         public function __call($name, $argument) {
             echo "对不起,您访问的".$name."()方法不存在!<br/>";
         }
    
        /**
        *__callstatic 访问一个不可访问的类方法(静态方法)的时候触发
        *@param string $name
        *@param array $argument 参数列表
         */
         public static function __callStatic($name, $argument) {
             echo "对不起,您访问的".$name."()静态方法不存在!<br/>";
         }
    
    }    

    PDODB.class.php文件:

    <?php
    header('content-type:text/html;charset=utf-8');
    /**
     * 封装PDODB类
     */
    // 加载接口
    include './I_DB.interface.php';
    class PDODB implements I_DB {
        /**
         * 定义相关属性
         */
        private $host;   //主机地址
        private $port;     //端口号
        private $user;     //用户名
        private $pass;     //密码
        private $dbname; //数据库名
        private $charset;//字符集
        private $dsn;      //数据源名称
        private $pdo;    //用于存放PDO的一个对象
        // 静态私有属性用于保存单例对象
        private static $instance;    
    
        /**
         * [__construct 构造方法]
         * @param [array] $config [配置数组]
         */
        private function __construct($config) {
            // 初始化属性
            $this->initParams($config);
            // 初始化dsn
            $this->initDSN();
            // 实例化PDO对象
            $this->initPDO();
            // 初始化PDO对象的属性
            $this->initAttribute();
        }
    
        /**
         * [getInstance 获取PDO单例对象的公开方法]
         * @param  [array] $config [description]
         * @return [PDOobject] self::$instance [pdo对象]
         */
        public static function getInstance($config) {
            if (!self::$instance instanceof self) {
                self::$instance = new self($config);
            }
            return self::$instance;
        }
    
        /**
         * [initParams 初始化属性]
         * @param  [array] $config [配置数组]
         */
        private function initParams($config) {
            $this->host = isset($config['host'])?$config['host']:'localhost';
            $this->port = isset($config['port'])?$config['port']:'3306';
            $this->user = isset($config['user'])?$config['user']:'root';
            $this->pass = isset($config['pass'])?$config['pass']:'';
            $this->dbname = isset($config['dbname'])?$config['dbname']:'';
            $this->charset = isset($config['charset'])?$config['charset']:'utf8';
        }
        /**
         * [initDSN 初始化dsn]
         */
        private function initDSN() {
            $this->dsn = "mysql:host=$this->host;port=$this->port;dbname=$this->dbname;charset=$this->charset";
        }
    
        /**
         * [initPDO 实例化PDO对象]
         * @return [boolean] [false|none]
         */
        private function initPDO() {
            // 在实例化PDO对象的时候自动的走异常模式(也是唯一走异常模式的地方)
            try{
                $this->pdo = new PDO($this->dsn,$this->user,$this->pass);
            }catch(PDOException $e) {
                $this->my_error($e);
            }
        }
    
        /**
         * [initAttribute 初始化PDO对象属性]
         * @return [boolean] [false|none]
         */
        private function initAttribute() {
            // 修改错误模式为异常模式
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        }
    
        /**
         * [my_error 输出异常信息]
         * @param  [PDOException] $e [异常对象]
         * @return [boolean]    [false|none]
         */
        private function my_error($e) {
            echo "执行sql语句失败!<br/>";
            echo "错误的代码是:",$e->getCode(),"<br/>";
            echo "错误的信息是:",$e->getMessage(),"<br/>";
            echo "错误的脚本是:",$e->getFile(),"<br/>";
            echo "错误的行号是:",$e->getLine(),'<br/>';
            return false;
        }
    
        /**
         * [my_query 执行一条sql语句,实现增删改]
         * @param  [string] $sql [sql语句]
         * @return [array] $result [资源结果集]
         */
        public function my_query($sql) {
            // 其实就是调用pdo对象中的exec方法
            try{
                $result = $this->pdo->exec($sql);
            }catch(PDOException $e) {
                $this->my_error($e);
            }
            return $result;
        }    
    
        /**
         * [fetchAll 查询所有]
         * @param  [string] $sql [sql语句]
         * @return [arry] $result [资源结果集]
         */
        public function fetchAll($sql) {
            // 其实就是调用PDOStatment对象里面的fetchAll方法
            try{
                $stmt = $this->pdo->query($sql);
                $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
                // 关闭游标,释放结果集
                $stmt->closeCursor();
            }catch(PDOException $e) {
                $this->my_error($e);
            }
            return $result;
        }
    
        /**
         * [fetchRow 查询一条]
         * @param  [string] $sql [sql语句]
         * @return [arry] $result [资源结果集]
         */
        public function fetchRow($sql) {
            // 其实就是调用PDOStatment对象里面的fetch方法
            try{
                $stmt = $this->pdo->query($sql);
                $result = $stmt->fetch(PDO::FETCH_ASSOC);
                // 关闭游标,释放结果集
                $stmt->closeCursor();
            }catch(PDOException $e) {
                $this->my_error($e);
            }
            return $result;
        }
    
        /**
         * [fetchColumn 查询单行单列]
         * @param  [string] $sql [sql语句]
         * @return [arry] $result [资源结果集]
         */
        public function fetchColumn($sql) {
            // 其实就是调用PDOStatment对象里面的fetchColumn方法
            try{
                $stmt = $this->pdo->query($sql);
                $result = $stmt->fetchColumn();
                // 关闭游标,释放结果集
                $stmt->closeCursor();
            }catch(PDOException $e) {
                $this->my_error($e);
            }
            return $result;
        }
    
    
        /**
         * [__clone 私有化克隆方法,保护单例模式]
         */
        private function __clone() {}
    
    
        /**
         * [__set 为一个不可访问的属性赋值的时候自动触发]
         * @param [string] $name  [属性名]
         * @param [mixed] $value [属性值]
         */
         public function __set($name,$value) {
             $allow_set = array('host','port','user','pass','dbname','charset');
             if(in_array($name,$allow_set)) {
                 //当前属性可以被赋值
                 $this->$name = $value;
             }
         }
    
    
        /**
         * [__get *获得一个不可访问的属性的值的时候自动触发]
         * @param  [string] $name [属性名]
         * @return [string] $name的value [该属性名的值]
         */
         public function __get($name) {
             $allow_get = array('host','port','user','pass','dbname','charset');
             if (in_array($name,$allow_get)) {
                 return $this->$name;
             }
         }
    
    
        /**
         * [__call 访问一个不可访问的对象方法的时候触发]
         * @param  [string] $name     [属性名]
         * @param  [array] $argument [参数列表]
         */
         public function __call($name, $argument) {
             echo "对不起,您访问的".$name."()方法不存在!<br/>";
         }
        
        /**
         * [__callstatic 访问一个不可访问的类方法(静态方法)的时候触发]
         * @param  [string] $name     [属性名]
         * @param  [array] $argument [参数列表]
         */
         public static function __callStatic($name, $argument) {
             echo "对不起,您访问的".$name."()静态方法不存在!<br/>";
         }
    }

    最后的测试类:

    <?php
    header('content-type:text/html;charset=utf-8');
    // 先读取配置文件
    $conf = include './config.php';
    
    $config = [
        'pass'=>'123456',
        'dbname'=>'bbs'
    ];
    
    // 实例化数据库操作对象
    switch ($conf['DB']['default_extension']) {
        case 'mysql':
            include './MySQLDB.class.php';
            $db = MySQLDB::getInstance($config);
            break;
        case 'pdo':
            include './PDODB.class.php';
            $db = PDODB::getInstance($config);
            break;
        default:
            break;
    }
    
    $sql = "select * from user limit 4";
    echo "<pre>";
    var_dump($db->fetchAll($sql));
    echo "</pre>";
    echo "<hr>";

    测试结果:

     还可以在配置文件config.php中切换到pdo中操作数据库!

  • 相关阅读:
    (转)6 个重构方法可帮你提升 80% 的代码质量
    (转)卸载和安装LINUX上的JDK
    (转)一些国外优秀的elasticsearch使用案例
    (转)Redis 集群方案
    (转)理想化的 Redis 集群
    (转)Hprose与WCF在云计算平台Azure上的对决
    (转).NET技术+25台服务器怎样支撑世界第54大网站
    Hbase split的过程以及解发条件
    test
    HTTP和HTTPS详解
  • 原文地址:https://www.cnblogs.com/mrszhou/p/7588492.html
Copyright © 2011-2022 走看看