当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP单例模式编写的PDO类的程序

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-15 11:12:37 浏览: 评论:0 

下面的代码是用此前一个名为MyPDO的类改写的,引入了单例模式来保证在全局调用中不会重复实例化这个类,降低系统资源的浪费,用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都是对数据库的一种极大考验和浪费,代码如下:

  1. <?php 
  2.  
  3. class MyPDO 
  4.     protected static $_instance = null; 
  5.     protected $dbName = ''
  6.     protected $dsn
  7.     protected $dbh
  8.      
  9.     /** 
  10.      * 构造 
  11.      *  
  12.      * @return MyPDO 
  13.      */ 
  14.     private function __construct($dbHost$dbUser$dbPasswd$dbName$dbCharset
  15.     { 
  16.         try { 
  17.             $this->dsn = 'mysql:host='.$dbHost.';dbname='.$dbName
  18.             $this->dbh = new PDO($this->dsn, $dbUser$dbPasswd); 
  19.             $this->dbh->exec('SET character_set_connection='.$dbCharset.', character_set_results='.$dbCharset.', character_set_client=binary'); 
  20.         } catch (PDOException $e) { 
  21.             $this->outputError($e->getMessage()); 
  22.         } 
  23.     } 
  24.      
  25.     /** 
  26.      * 防止克隆 
  27.      *  
  28.      */ 
  29.     private function __clone() {} 
  30.      
  31.     /** 
  32.      * Singleton instance 
  33.      *  
  34.      * @return Object 
  35.      */ 
  36.     public static function getInstance($dbHost$dbUser$dbPasswd$dbName$dbCharset
  37.     { 
  38.         if (self::$_instance === null) { 
  39.             self::$_instance = new self($dbHost$dbUser$dbPasswd$dbName$dbCharset); 
  40.         } 
  41.         return self::$_instance
  42.     } 
  43.      
  44.     /** 
  45.      * Query 查询 
  46.      * 
  47.      * @param String $strSql SQL语句 
  48.      * @param String $queryMode 查询方式(All or Row) 
  49.      * @param Boolean $debug 
  50.      * @return Array 
  51.      */ 
  52.     public function query($strSql$queryMode = 'All'$debug = false) 
  53.     { 
  54.         if ($debug === true) $this->debug($strSql); 
  55.         $recordset = $this->dbh->query($strSql); 
  56.         $this->getPDOError(); 
  57.         if ($recordset) { 
  58.             $recordset->setFetchMode(PDO::FETCH_ASSOC); 
  59.             if ($queryMode == 'All') { 
  60.                 $result = $recordset->fetchAll(); 
  61.             } elseif ($queryMode == 'Row') { 
  62.                 $result = $recordset->fetch(); 
  63.             } 
  64.         } else { 
  65.             $result = null; 
  66.         } 
  67.         return $result
  68.     } 
  69.      
  70.     /** 
  71.      * Update 更新 
  72.      * 
  73.      * @param String $table 表名 
  74.      * @param Array $arrayDataValue 字段与值 
  75.      * @param String $where 条件 
  76.      * @param Boolean $debug 
  77.      * @return Int 
  78.      */ 
  79.     public function update($table$arrayDataValue$where = ''$debug = false) 
  80.     { 
  81.         $this->checkFields($table$arrayDataValue); 
  82.         if ($where) { 
  83.             $strSql = ''
  84.             foreach ($arrayDataValue as $key => $value) { 
  85.                 $strSql .= ", `$key`='$value'"
  86.             } 
  87.             $strSql = substr($strSql, 1); 
  88.             $strSql = "UPDATE `$table` SET $strSql WHERE $where"
  89.         } else { 
  90.             $strSql = "REPLACE INTO `$table` (`".implode('`,`'array_keys($arrayDataValue))."`) VALUES ('".implode("','"$arrayDataValue)."')"
  91.         } 
  92.         if ($debug === true) $this->debug($strSql); 
  93.         $result = $this->dbh->exec($strSql); 
  94.         $this->getPDOError(); 
  95.         return $result
  96.     } 
  97.      
  98.     /** 
  99.      * Insert 插入 
  100.      * 
  101.      * @param String $table 表名 
  102.      * @param Array $arrayDataValue 字段与值 
  103.      * @param Boolean $debug 
  104.      * @return Int 
  105.      */ 
  106.     public function insert($table$arrayDataValue$debug = false) 
  107.     { 
  108.         $this->checkFields($table$arrayDataValue); 
  109.         $strSql = "INSERT INTO `$table` (`".implode('`,`'array_keys($arrayDataValue))."`) VALUES ('".implode("','"$arrayDataValue)."')"
  110.         if ($debug === true) $this->debug($strSql); 
  111.         $result = $this->dbh->exec($strSql); 
  112.         $this->getPDOError(); 
  113.         return $result
  114.     } 
  115.      
  116.     /** 
  117.      * Replace 覆盖方式插入 
  118.      * 
  119.      * @param String $table 表名 
  120.      * @param Array $arrayDataValue 字段与值 
  121.      * @param Boolean $debug 
  122.      * @return Int 
  123.      */ 
  124.     public function replace($table$arrayDataValue$debug = false) 
  125.     { 
  126.         $this->checkFields($table$arrayDataValue); 
  127.         $strSql = "REPLACE INTO `$table`(`".implode('`,`'array_keys($arrayDataValue))."`) VALUES ('".implode("','"$arrayDataValue)."')"
  128.         if ($debug === true) $this->debug($strSql); 
  129.         $result = $this->dbh->exec($strSql); 
  130.         $this->getPDOError(); 
  131.         return $result
  132.     } 
  133.      
  134.     /** 
  135.      * Delete 删除 
  136.      * 
  137.      * @param String $table 表名 
  138.      * @param String $where 条件 
  139.      * @param Boolean $debug 
  140.      * @return Int 
  141.      */ 
  142.     public function delete($table$where = ''$debug = false) 
  143.     { 
  144.         if ($where == '') { 
  145.             $this->outputError("'WHERE' is Null"); 
  146.         } else { 
  147.             $strSql = "DELETE FROM `$table` WHERE $where"
  148.             if ($debug === true) $this->debug($strSql); 
  149.             $result = $this->dbh->exec($strSql); 
  150.             $this->getPDOError(); 
  151.             return $result
  152.         } 
  153.     } 
  154.      
  155.     /** 
  156.      * execSql 执行SQL语句 
  157.      * 
  158.      * @param String $strSql 
  159.      * @param Boolean $debug 
  160.      * @return Int 
  161.      */ 
  162.     public function execSql($strSql$debug = false) 
  163.     { 
  164.         if ($debug === true) $this->debug($strSql); 
  165.         $result = $this->dbh->exec($strSql); 
  166.         $this->getPDOError(); 
  167.         return $result
  168.     } 
  169.      
  170.     /** 
  171.      * 获取字段最大值 
  172.      *  
  173.      * @param string $table 表名 
  174.      * @param string $field_name 字段名 
  175.      * @param string $where 条件 
  176.      */ 
  177.     public function getMaxValue($table$field_name$where = ''$debug = false) 
  178.     { 
  179.         $strSql = "SELECT MAX(".$field_name.") AS MAX_VALUE FROM $table"
  180.         if ($where != ''$strSql .= " WHERE $where"
  181.         if ($debug === true) $this->debug($strSql); 
  182.         $arrTemp = $this->query($strSql'Row'); 
  183.         $maxValue = $arrTemp["MAX_VALUE"]; 
  184.         if ($maxValue == "" || $maxValue == null) { 
  185.             $maxValue = 0; 
  186.         } 
  187.         return $maxValue
  188.     } 
  189.      
  190.     /** 
  191.      * 获取指定列的数量 
  192.      *  
  193.      * @param string $table 
  194.      * @param string $field_name 
  195.      * @param string $where 
  196.      * @param bool $debug 
  197.      * @return int 
  198.      */ 
  199.     public function getCount($table$field_name$where = ''$debug = false) 
  200.     { 
  201.         $strSql = "SELECT COUNT($field_name) AS NUM FROM $table"
  202.         if ($where != ''$strSql .= " WHERE $where"
  203.         if ($debug === true) $this->debug($strSql); 
  204.         $arrTemp = $this->query($strSql'Row'); 
  205.         return $arrTemp['NUM']; 
  206.     } 
  207.      
  208.     /** 
  209.      * 获取表引擎 
  210.      *  
  211.      * @param String $dbName 库名 
  212.      * @param String $tableName 表名 
  213.      * @param Boolean $debug 
  214.      * @return String 
  215.      */ 
  216.     public function getTableEngine($dbName$tableName
  217.     { 
  218.         $strSql = "SHOW TABLE STATUS FROM $dbName WHERE Name='".$tableName."'"
  219.         $arrayTableInfo = $this->query($strSql); 
  220.         $this->getPDOError(); 
  221.         return $arrayTableInfo[0]['Engine']; 
  222.     } 
  223.      
  224.     /** 
  225.      * beginTransaction 事务开始 
  226.      */ 
  227.     private function beginTransaction() 
  228.     { 
  229.         $this->dbh->beginTransaction(); 
  230.     } 
  231.      
  232.     /** 
  233.      * commit 事务提交 
  234.      */ 
  235.     private function commit() 
  236.     { 
  237.         $this->dbh->commit(); 
  238.     } 
  239.      
  240.     /** 
  241.      * rollback 事务回滚 
  242.      */ 
  243.     private function rollback() 
  244.     { 
  245.         $this->dbh->rollback(); 
  246.     } 
  247.      
  248.     /** 
  249.      * transaction 通过事务处理多条SQL语句 
  250.      * 调用前需通过getTableEngine判断表引擎是否支持事务 
  251.      * 
  252.      * @param array $arraySql 
  253.      * @return Boolean 
  254.      */ 
  255.     public function execTransaction($arraySql
  256.     { 
  257.         $retval = 1; 
  258.         $this->beginTransaction(); 
  259.         foreach ($arraySql as $strSql) { 
  260.             if ($this->execSql($strSql) == 0) $retval = 0; 
  261.         } 
  262.         if ($retval == 0) { 
  263.             $this->rollback(); 
  264.             return false; 
  265.         } else { 
  266.             $this->commit(); 
  267.             return true; 
  268.         } 
  269.     } 
  270.  
  271.     /** 
  272.      * checkFields 检查指定字段是否在指定数据表中存在 
  273.      * 
  274.      * @param String $table 
  275.      * @param array $arrayField 
  276.      */ 
  277.     private function checkFields($table$arrayFields
  278.     { 
  279.         $fields = $this->getFields($table); 
  280.         foreach ($arrayFields as $key => $value) { 
  281.             if (!in_array($key$fields)) { 
  282.                 $this->outputError("Unknown column `$key` in field list."); 
  283.             } 
  284.         } 
  285.     } 
  286.      
  287.     /** 
  288.      * getFields 获取指定数据表中的全部字段名 
  289.      * 
  290.      * @param String $table 表名 
  291.      * @return array 
  292.      */ 
  293.     private function getFields($table
  294.     { 
  295.         $fields = array(); 
  296.         $recordset = $this->dbh->query("SHOW COLUMNS FROM $table"); 
  297.         $this->getPDOError(); 
  298.         $recordset->setFetchMode(PDO::FETCH_ASSOC); 
  299.         $result = $recordset->fetchAll(); 
  300.         foreach ($result as $rows) { 
  301.             $fields[] = $rows['Field']; 
  302.         } 
  303.         return $fields
  304.     } 
  305.      
  306.     /** 
  307.      * getPDOError 捕获PDO错误信息 
  308.      */ 
  309.     private function getPDOError() 
  310.     { 
  311.         if ($this->dbh->errorCode() != '00000') { 
  312.             $arrayError = $this->dbh->errorInfo(); 
  313.             $this->outputError($arrayError[2]); 
  314.         } 
  315.     } 
  316.      
  317.     /** 
  318.      * debug 
  319.      *  
  320.      * @param mixed $debuginfo 
  321.      */ 
  322.     private function debug($debuginfo
  323.     { 
  324.         var_dump($debuginfo); 
  325.         exit(); 
  326.     } 
  327.      
  328.     /** 
  329.      * 输出错误信息 
  330.      *  
  331.      * @param String $strErrMsg 
  332.      */ 
  333.     private function outputError($strErrMsg
  334.     { 
  335.         throw new Exception('MySQL Error: '.$strErrMsg); 
  336.     }  //开源软件:phpfensi.com 
  337.      
  338.     /** 
  339.      * destruct 关闭数据库连接 
  340.      */ 
  341.     public function destruct() 
  342.     { 
  343.         $this->dbh = null; 
  344.     } 
  345. ?> 

调用方法:

  1. <?php 
  2. require 'MyPDO.class.php'
  3. $db = MyPDO::getInstance('localhost''root''123456''test''utf8'); 
  4.  
  5. //do something... 
  6.  
  7. $db->destruct(); 
  8. ?>

Tags: PHP单例模式 PDO类程序

分享到: