加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

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

发布时间:2020-05-27 20:36:04 所属栏目:PHP 来源:互联网
导读:这篇文章的代码是用此前一个名为MyPDO的类改写的,引入了单例模式来保证在全局调用中不会重复实例化这个类,降低系统资源的浪费。有需要的朋友们可以参考借鉴,下面来一起看看吧。

一、单例模式简介

简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务;

二、为什么要使用PHP单例模式?

1、php的应用主要在于数据库应用,所以一个应用中会存在大量的数据库操作,使用单例模式,则可以避免大量的new 操作消耗的资源。

2、如果系统中需要有一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。

3、在一次页面请求中,便于进行调试,因为所有的代码(例如数据库操作类db)都集中在一个类中,我们可以在类中设置钩子,输出日志,从而避免到处var_dump,echo

三、PHP基于单例模式编写PDO类的示例代码

代码如下:

* @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,$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,$dbCharset)
    {
    if (self::$_instance === null) {
    self::$_instance = new self($dbHost,$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);
    $strSql = "INSERT INTO $table (".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);
    $strSql = "REPLACE INTO $table(".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,$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,$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,$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;
    }
    }

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读