• PHP基于单例模式编写PDO类的方法


    一、单例模式简介
    
    简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务;
    
    二、为什么要使用PHP单例模式?
    
         1、php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。
    
         2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。
    
         3、在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
    
    三、PHP基于单例模式编写PDO类的示例代码
    
    代码如下:
    
    一、单例模式简介
    
    简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务;
    
    二、为什么要使用PHP单例模式?
    
         1、php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。
    
         2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。
    
         3、在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
    
    三、PHP基于单例模式编写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
    require 'MyPDO.class.php';
    $db = MyPDO::getInstance('localhost', 'root', '123456', 'test', 'utf8');
      
    //do something...
      
    $db->destruct();
    ?>
    

      

  • 相关阅读:
    Apache Flink 1.12.1发布
    flink 修改web页面刷新时间
    flink 支持的sql 方言
    flink sql 读取hive 表报错
    Typora配置正文、目录、侧边大纲中的标题自动编号
    滴滴开源Logi-KafkaManager 一站式Kafka监控与管控平台
    建立 nfs 服务器
    Linux 设备驱动的第一个例子 。
    备份.vimrc
    shell编程实例
  • 原文地址:https://www.cnblogs.com/benpaodegegen/p/7365656.html
Copyright © 2020-2023  润新知