Maison  >  Article  >  développement back-end  >  PHP implémente la méthode d'écriture de classe PDO basée sur le mode singleton

PHP implémente la méthode d'écriture de classe PDO basée sur le mode singleton

墨辰丷
墨辰丷original
2018-06-01 11:22:091325parcourir

Le code de cet article a été réécrit en utilisant une classe précédente appelée MyPDO. Le mode singleton a été introduit pour garantir que cette classe ne sera pas instanciée à plusieurs reprises dans les appels globaux et réduire le gaspillage de ressources système. Les amis dans le besoin peuvent s’y référer, jetons un coup d’œil ci-dessous.

1. Introduction au modèle singleton

En termes simples, un objet (avant d'apprendre le modèle de conception, vous devez comprendre le orientation Pensée objet) n'est responsable que d'une tâche spécifique

2. Pourquoi utiliser le mode PHP singleton ?

1. L'application de PHP se situe principalement dans les applications de base de données, il y aura donc un grand nombre d'opérations de base de données dans une application. L'utilisation du mode singleton peut éviter la consommation d'un. un grand nombre de nouvelles opérations.

2. Si une classe est nécessaire pour contrôler globalement certaines informations de configuration dans le système, elle peut être facilement implémentée en utilisant le mode singleton. Celui-ci peut être trouvé dans la section FrontController de ZF.

3. Dans une requête de page, il est facile de déboguer, car tout le code (tel que la classe d'opération de base de données db) est concentré dans une seule classe, nous pouvons définir des hooks dans la classe et afficher les journaux , Évitant ainsi var_dump, echo partout.

3. Exemple de code pour écrire une classe PDO en PHP basée sur le mode singleton

Le code est le suivant :

<?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 = &#39;&#39;;
 protected $dsn;
 protected $dbh;
 
 /**
  * 构造
  * 
  * @return MyPDO
  */
 private function __construct($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset)
 {
  try {
   $this->dsn = &#39;mysql:host=&#39;.$dbHost.&#39;;dbname=&#39;.$dbName;
   $this->dbh = new PDO($this->dsn, $dbUser, $dbPasswd);
   $this->dbh->exec(&#39;SET character_set_connection=&#39;.$dbCharset.&#39;, character_set_results=&#39;.$dbCharset.&#39;, character_set_client=binary&#39;);
  } 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 = &#39;All&#39;, $debug = false)
 {
  if ($debug === true) $this->debug($strSql);
  $recordset = $this->dbh->query($strSql);
  $this->getPDOError();
  if ($recordset) {
   $recordset->setFetchMode(PDO::FETCH_ASSOC);
   if ($queryMode == &#39;All&#39;) {
    $result = $recordset->fetchAll();
   } elseif ($queryMode == &#39;Row&#39;) {
    $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 = &#39;&#39;, $debug = false)
 {
  $this->checkFields($table, $arrayDataValue);
  if ($where) {
   $strSql = &#39;&#39;;
   foreach ($arrayDataValue as $key => $value) {
    $strSql .= ", `$key`=&#39;$value&#39;";
   }
   $strSql = substr($strSql, 1);
   $strSql = "UPDATE `$table` SET $strSql WHERE $where";
  } else {
   $strSql = "REPLACE INTO `$table` (`".implode(&#39;`,`&#39;, array_keys($arrayDataValue))."`) VALUES (&#39;".implode("&#39;,&#39;", $arrayDataValue)."&#39;)";
  }
  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(&#39;`,`&#39;, array_keys($arrayDataValue))."`) VALUES (&#39;".implode("&#39;,&#39;", $arrayDataValue)."&#39;)";
  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(&#39;`,`&#39;, array_keys($arrayDataValue))."`) VALUES (&#39;".implode("&#39;,&#39;", $arrayDataValue)."&#39;)";
  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 = &#39;&#39;, $debug = false)
 {
  if ($where == &#39;&#39;) {
   $this->outputError("&#39;WHERE&#39; 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 = &#39;&#39;, $debug = false)
 {
  $strSql = "SELECT MAX(".$field_name.") AS MAX_VALUE FROM $table";
  if ($where != &#39;&#39;) $strSql .= " WHERE $where";
  if ($debug === true) $this->debug($strSql);
  $arrTemp = $this->query($strSql, &#39;Row&#39;);
  $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 = &#39;&#39;, $debug = false)
 {
  $strSql = "SELECT COUNT($field_name) AS NUM FROM $table";
  if ($where != &#39;&#39;) $strSql .= " WHERE $where";
  if ($debug === true) $this->debug($strSql);
  $arrTemp = $this->query($strSql, &#39;Row&#39;);
  return $arrTemp[&#39;NUM&#39;];
 }
 
 /**
  * 获取表引擎
  * 
  * @param String $dbName 库名
  * @param String $tableName 表名
  * @param Boolean $debug
  * @return String
  */
 public function getTableEngine($dbName, $tableName)
 {
  $strSql = "SHOW TABLE STATUS FROM $dbName WHERE Name=&#39;".$tableName."&#39;";
  $arrayTableInfo = $this->query($strSql);
  $this->getPDOError();
  return $arrayTableInfo[0][&#39;Engine&#39;];
 }
 
 /**
  * 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[&#39;Field&#39;];
  }
  return $fields;
 }
 
 /**
  * getPDOError 捕获PDO错误信息
  */
 private function getPDOError()
 {
  if ($this->dbh->errorCode() != &#39;00000&#39;) {
   $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(&#39;MySQL Error: &#39;.$strErrMsg);
 }
 
 /**
  * destruct 关闭数据库连接
  */
 public function destruct()
 {
  $this->dbh = null;
 }
}
?>

4. Méthode d'appel :

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

Résumé : Ce qui précède représente l’intégralité du contenu de cet article, j’espère qu’il sera utile à l’étude de chacun.

Recommandations associées :

phpExplication détaillée de deux méthodes d'exportation native de fichiers Excel

php Implémentation du tri temporel de tableau bidimensionnel

phpMéthodes pour résoudre le code tronqué du DOM

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn