国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP基于單例模式編寫PDO類的方法

2024-05-04 23:49:47
字體:
來源:轉載
供稿:網友

一、單例模式簡介

簡單的說,一個對象(在學習設計模式之前,需要比較了解面向對象思想)只負責一個特定的任務;

二、為什么要使用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; }}?>

四、調用方法:

<?phprequire 'MyPDO.class.php';$db = MyPDO::getInstance('localhost', 'root', '123456', 'test', 'utf8'); //do something... $db->destruct();?>

五、總結

以上就是PHP基于單例模式編寫PDO類的全部內容,希望對大家學習或者使用PHP能有所幫助,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 南投县| 久治县| 乌拉特前旗| 南陵县| 永清县| 汾西县| 巴东县| 上虞市| 霍州市| 隆昌县| 阿克陶县| 光泽县| 宜宾县| 平遥县| 衢州市| 阳曲县| 城口县| 襄城县| 儋州市| 策勒县| 平陆县| 涟源市| 天柱县| 瑞丽市| 兴化市| 呼和浩特市| 甘孜| 株洲县| 贡嘎县| 四子王旗| 潜江市| 东丽区| 绵阳市| 台湾省| 太仆寺旗| 辽宁省| 贞丰县| 龙海市| 绥江县| 邓州市| 贺州市|