zoukankan      html  css  js  c++  java
  • 封装PDO单例模式类

    <?php
    /**
    * MyPDO
    * @author Jason.Wei <jasonwei06@hotmail.com>
    * @license http://www.sunbloger.com/
    * @version 5.0 utf8
    */
    class MyPDO
    {
        protected static $_instance = null;
        protected $dbName = '';
        protected $dsn;
        protected $dbh;
        
        /**
         * 构造
         *
         * @return MyPDO
         */
        private function __construct($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset)
        {
            try {
                $this->dsn = 'mysql:host='.$dbHost.';dbname='.$dbName;
                $this->dbh = new PDO($this->dsn, $dbUser, $dbPasswd);
                $this->dbh->exec('SET character_set_connection='.$dbCharset.', character_set_results='.$dbCharset.', character_set_client=binary');
            } catch (PDOException $e) {
                $this->outputError($e->getMessage());
            }
        }
        
        /**
         * 防止克隆
         *
         */
        private function __clone() {}
        
        /**
         * Singleton instance
         *
         * @return Object
         */
        public static function getInstance($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset)
        {
            if (self::$_instance === null) {
                self::$_instance = new self($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset);
            }
            return self::$_instance;
        }
        
        /**
         * Query 查询
         *
         * @param String $strSql SQL语句
         * @param String $queryMode 查询方式(All or Row)
         * @param Boolean $debug
         * @return Array
         */
        public function query($strSql, $queryMode = 'All', $debug = false)
        {
            if ($debug === true) $this->debug($strSql);
            $recordset = $this->dbh->query($strSql);
            $this->getPDOError();
            if ($recordset) {
                $recordset->setFetchMode(PDO::FETCH_ASSOC);
                if ($queryMode == 'All') {
                    $result = $recordset->fetchAll();
                } elseif ($queryMode == 'Row') {
                    $result = $recordset->fetch();
                }
            } else {
                $result = null;
            }
            return $result;
        }
        
        /**
         * Update 更新
         *
         * @param String $table 表名
         * @param Array $arrayDataValue 字段与值
         * @param String $where 条件
         * @param Boolean $debug
         * @return Int
         */
        public function update($table, $arrayDataValue, $where = '', $debug = false)
        {
            $this->checkFields($table, $arrayDataValue);
            if ($where) {
                $strSql = '';
                foreach ($arrayDataValue as $key => $value) {
                    $strSql .= ", `$key`='$value'";
                }
                $strSql = substr($strSql, 1);
                $strSql = "UPDATE `$table` SET $strSql WHERE $where";
            } else {
                $strSql = "REPLACE INTO `$table` (`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";
            }
            if ($debug === true) $this->debug($strSql);
            $result = $this->dbh->exec($strSql);
            $this->getPDOError();
            return $result;
        }
        
        /**
         * Insert 插入
         *
         * @param String $table 表名
         * @param Array $arrayDataValue 字段与值
         * @param Boolean $debug
         * @return Int
         */
        public function insert($table, $arrayDataValue, $debug = false)
        {
            $this->checkFields($table, $arrayDataValue);
            $strSql = "INSERT INTO `$table` (`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";
            if ($debug === true) $this->debug($strSql);
            $result = $this->dbh->exec($strSql);
            $this->getPDOError();
            return $result;
        }
        
        /**
         * Replace 覆盖方式插入
         *
         * @param String $table 表名
         * @param Array $arrayDataValue 字段与值
         * @param Boolean $debug
         * @return Int
         */
        public function replace($table, $arrayDataValue, $debug = false)
        {
            $this->checkFields($table, $arrayDataValue);
            $strSql = "REPLACE INTO `$table`(`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";
            if ($debug === true) $this->debug($strSql);
            $result = $this->dbh->exec($strSql);
            $this->getPDOError();
            return $result;
        }
        
        /**
         * Delete 删除
         *
         * @param String $table 表名
         * @param String $where 条件
         * @param Boolean $debug
         * @return Int
         */
        public function delete($table, $where = '', $debug = false)
        {
            if ($where == '') {
                $this->outputError("'WHERE' is Null");
            } else {
                $strSql = "DELETE FROM `$table` WHERE $where";
                if ($debug === true) $this->debug($strSql);
                $result = $this->dbh->exec($strSql);
                $this->getPDOError();
                return $result;
            }
        }
        
        /**
         * execSql 执行SQL语句
         *
         * @param String $strSql
         * @param Boolean $debug
         * @return Int
         */
        public function execSql($strSql, $debug = false)
        {
            if ($debug === true) $this->debug($strSql);
            $result = $this->dbh->exec($strSql);
            $this->getPDOError();
            return $result;
        }
        
        /**
         * 获取字段最大值
         *
         * @param string $table 表名
         * @param string $field_name 字段名
         * @param string $where 条件
         */
        public function getMaxValue($table, $field_name, $where = '', $debug = false)
        {
            $strSql = "SELECT MAX(".$field_name.") AS MAX_VALUE FROM $table";
            if ($where != '') $strSql .= " WHERE $where";
            if ($debug === true) $this->debug($strSql);
            $arrTemp = $this->query($strSql, 'Row');
            $maxValue = $arrTemp["MAX_VALUE"];
            if ($maxValue == "" || $maxValue == null) {
                $maxValue = 0;
            }
            return $maxValue;
        }
        
        /**
         * 获取指定列的数量
         *
         * @param string $table
         * @param string $field_name
         * @param string $where
         * @param bool $debug
         * @return int
         */
        public function getCount($table, $field_name, $where = '', $debug = false)
        {
            $strSql = "SELECT COUNT($field_name) AS NUM FROM $table";
            if ($where != '') $strSql .= " WHERE $where";
            if ($debug === true) $this->debug($strSql);
            $arrTemp = $this->query($strSql, 'Row');
            return $arrTemp['NUM'];
        }
        
        /**
         * 获取表引擎
         *
         * @param String $dbName 库名
         * @param String $tableName 表名
         * @param Boolean $debug
         * @return String
         */
        public function getTableEngine($dbName, $tableName)
        {
            $strSql = "SHOW TABLE STATUS FROM $dbName WHERE Name='".$tableName."'";
            $arrayTableInfo = $this->query($strSql);
            $this->getPDOError();
            return $arrayTableInfo[0]['Engine'];
        }
        
        /**
         * beginTransaction 事务开始
         */
        private function beginTransaction()
        {
            $this->dbh->beginTransaction();
        }
        
        /**
         * commit 事务提交
         */
        private function commit()
        {
            $this->dbh->commit();
        }
        
        /**
         * rollback 事务回滚
         */
        private function rollback()
        {
            $this->dbh->rollback();
        }
        
        /**
         * transaction 通过事务处理多条SQL语句
         * 调用前需通过getTableEngine判断表引擎是否支持事务
         *
         * @param array $arraySql
         * @return Boolean
         */
        public function execTransaction($arraySql)
        {
            $retval = 1;
            $this->beginTransaction();
            foreach ($arraySql as $strSql) {
                if ($this->execSql($strSql) == 0) $retval = 0;
            }
            if ($retval == 0) {
                $this->rollback();
                return false;
            } else {
                $this->commit();
                return true;
            }
        }
     
        /**
         * checkFields 检查指定字段是否在指定数据表中存在
         *
         * @param String $table
         * @param array $arrayField
         */
        private function checkFields($table, $arrayFields)
        {
            $fields = $this->getFields($table);
            foreach ($arrayFields as $key => $value) {
                if (!in_array($key, $fields)) {
                    $this->outputError("Unknown column `$key` in field list.");
                }
            }
        }
        
        /**
         * getFields 获取指定数据表中的全部字段名
         *
         * @param String $table 表名
         * @return array
         */
        private function getFields($table)
        {
            $fields = array();
            $recordset = $this->dbh->query("SHOW COLUMNS FROM $table");
            $this->getPDOError();
            $recordset->setFetchMode(PDO::FETCH_ASSOC);
            $result = $recordset->fetchAll();
            foreach ($result as $rows) {
                $fields[] = $rows['Field'];
            }
            return $fields;
        }
        
        /**
         * getPDOError 捕获PDO错误信息
         */
        private function getPDOError()
        {
            if ($this->dbh->errorCode() != '00000') {
                $arrayError = $this->dbh->errorInfo();
                $this->outputError($arrayError[2]);
            }
        }
        
        /**
         * debug
         *
         * @param mixed $debuginfo
         */
        private function debug($debuginfo)
        {
            var_dump($debuginfo);
            exit();
        }
        
        /**
         * 输出错误信息
         *
         * @param String $strErrMsg
         */
        private function outputError($strErrMsg)
        {
            throw new Exception('MySQL Error: '.$strErrMsg);
        }
        
        /**
         * destruct 关闭数据库连接
         */
        public function destruct()
        {
            $this->dbh = null;
        }
    }
    ?>
    调用方法:
    PHP
    <?php require 'MyPDO.class.php'; $db = MyPDO::getInstance('localhost', 'root', '123456', 'test', 'utf8'); //do something... $db->destruct(); ?>
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    require 'MyPDO.class.php';
    $db = MyPDO::getInstance('localhost', 'root', '123456', 'test', 'utf8');
     
    //do something...
     
    $db->destruct();
    ?>
     
  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/phpzlq/p/8890933.html
Copyright © 2011-2022 走看看