日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

php 单例类 mysql pdo_PHP实战:PHP基于单例模式编写PDO类的方法

發布時間:2025/3/20 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 单例类 mysql pdo_PHP实战:PHP基于单例模式编写PDO类的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

《PHP實戰:PHP基于單例模式編寫PDO類的方法》要點:

本文介紹了PHP實戰:PHP基于單例模式編寫PDO類的方法,希望對您有用。如果有疑問,可以聯系我們。

一、單例模式簡介

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

二、為什么要使用PHP單例模式?

PHP實戰

1、php的應用主要在于數據庫應用, 所以一個應用中會存在大量的數據庫操作, 使用單例模式, 則可以避免大量的new 操作消耗的資源.

PHP實戰

2、如果系統中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實現. 這個可以參看ZF的FrontController部分.

PHP實戰

3、在一次頁面請求中, 便于進行調試, 因為所有的代碼(例如數據庫操作類db)都集中在一個類中, 我們可以在類中設置鉤子, 輸出日志,從而避免到處var_dump, echo.PHP實戰

三、PHP基于單例模式編寫PDO類的示例代碼

PHP實戰

代碼如下:PHP實戰

/**

* MyPDO

* @author Jason.Wei

* @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();

?>

五、總結

PHP實戰

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

PHP實戰

總結

以上是生活随笔為你收集整理的php 单例类 mysql pdo_PHP实战:PHP基于单例模式编写PDO类的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。