一、单例模式简介简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务;二、为什么要使用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();
?>

  

转载于:https://www.cnblogs.com/benpaodegegen/p/7365656.html

PHP基于单例模式编写PDO类的方法相关推荐

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

    <PHP实战:PHP基于单例模式编写PDO类的方法>要点: 本文介绍了PHP实战:PHP基于单例模式编写PDO类的方法,希望对您有用.如果有疑问,可以联系我们. 一.单例模式简介 简单的说 ...

  2. java 基于类路径搜索_一种基于ClassLoader的自定义类查找方法与流程

    本发明涉及IT技术领域,特别是指一种基于ClassLoader的自定义类查找方法. 背景技术: 随着信息系统的复杂性日益增大,使用反射机制设计的系统越来越多.根据不同的业务需要通过反射去获得相应的处理 ...

  3. 编写一个类的方法,其输入参数为一个整数,输出为该整数各个位上的最大数字

    1. 编写一个类的方法,其输入参数为一个整数,输出为该整数各个位上的最大数字. import java.util.*;public class Main {public static int s(in ...

  4. XCode中的单元测试:编写测试类和方法(内容意译自苹果官方文档)

    当你在工程中通过测试导航栏添加了一个测试target之后, xcode会在测试导航栏中显示该target所属的测试类和方法. 这一章演示了怎么创建测试类,以及如何编写测试方法. 测试targets, ...

  5. SpringMVC基于框架编写CommDao类---findList

    大家好 已经过了将近一个星期没有发博客了,手心也有点痒痒的.今天周五一点时间我们看如何编写Dao方法. 这个方法我们是基于SpringMVC框架的,其实出发点是这样的.因为我们很多类的类字段都是不一样 ...

  6. php mysql 单例模式_PHP基于单例模式实现的mysql类

    本文实例讲述了PHP基于单例模式实现的mysql类.分享给大家供大家参考,具体如下:<?php defined('ACC')||exit('Access Denied'); // 封装mysql ...

  7. 《JAVA练习题目8》 编写一个类Person,包含的属性和方法如下: 属性:字符串类型的名字name,字符类型的性别gender,和整型的序号number

    题目内容: 编写一个类Person,包含的属性和方法如下: 属性:字符串类型的名字name,字符类型的性别gender,和整型的序号number:方法:showMe,以"name-gende ...

  8. java 单例基类_PHP基于单例模式实现的数据库操作基类

    本文实例讲述了PHP基于单例模式实现的数据库操作基类.分享给大家供大家参考,具体如下: 配置文件: $db = array( 'host'=>'localhost', 'user'=>'r ...

  9. abaqus编写本构方程vumat_基于ABAQUS的木材本构关系数值模拟方法与流程

    本发明属于木材本构研究技术领域,提供了木材在复杂应力状态下应力-应变关系的数值模拟方法. 背景技术: 木材是各向异性材料,其本构的复杂主要表现为在受压作用下发生塑性变形,而在拉.剪作用下发生脆性破坏, ...

最新文章

  1. SBB:石油污染土壤微生物群落构建与生物多样性研究
  2. html里字号rem,html中的em和rem到底该如何使用,自适应效果中如何确定文字大小/字号?...
  3. C# HasRows 和 Read的区别
  4. 1411区间内的真素数2
  5. Linux查看CPU,内存,GPU,进程,版本,系统内核信息
  6. JS特效——黑客效果JS代码(摘取)
  7. Android属性动画 ViewPropertyAnimator
  8. JS数组reduce()方法
  9. open-falcon的插件机制
  10. 织梦怎样调取mysql_如何实现dedecms外部数据库调用
  11. Spring启动NoClassDefFoundError中EmbeddedValueResolver错误
  12. javascript将页面设为首页代码大全
  13. html位置插入透明动画文字,鼠标放上去,图片上方动态显示半透明说明文字(源码)...
  14. 直流电机驱动模块介绍
  15. 【R语言】如何进行英文分词统计(以《爱丽丝漫游奇境》词频统计为例)(20年3月22日复习笔记)
  16. 编译原理:语法制导翻译
  17. process monitor解决网络问题一则
  18. 新C# 操作Excel属性
  19. 【面试题】1383- 面试官问:Vue3 对比 Vue2 有哪些变化?
  20. 更改cadence617 schematic和visualizationAnalysis界面背景颜色

热门文章

  1. matlab两个图共用一个x轴_如何在Matlab中插入两个X轴图
  2. mysql经典总结文章_MySQL基础篇(01):经典实用查询案例,总结整理
  3. 【ruoyi若依】启用HTTPS/SSL后,首页重定向出错
  4. 【微信小程序】给绑定事件传参数
  5. 【若依(ruoyi)】 Shiro 向 ShiroFilterFactoryBean 中添加自定义过滤器
  6. 【oracle】oracle jdbc驱动与c3p0的一个兼容问题
  7. LISP标注路线桩号_CAD插件标桩号的AutoLISP程序语言求解释并译成中文,谢谢
  8. mongodb 查多个不等于_高可用架构之商城的mongodb设计分析
  9. python丢失api-ms-win-crt-process_api-ms-win-crt-process-l1-1-0.dll 丢失的处理,遇到问题和完美解决...
  10. DGL教程【五】使用自己的数据集