【问题标题】:Do I have this PDO Connection Class right?我有这个 PDO 连接类吗?
【发布时间】:2010-12-10 11:26:47
【问题描述】:

最近几天我一直在玩 PDO,我正在开发一个小型 CMS 系统来自学 OOP 技能,但即使它只是一个小型 CMS,我希望它能够处理任何事情网络可以扔给它。

这是我目前为止的想法,我将在构造函数中添加连接池,以便按需启用大量并发连接。我对这个 OOP 东西很陌生,所以我想要一点建议和批评,毫无疑问我在这里做了一些非常错误的事情。

我将Global or Singleton for database connection? 的最佳答案作为基本设计,尽管我添加了一个私有构造函数,因为我想在整个类中使用 $this->dbConnectionInstance 以供众多辅助函数使用。

非常感谢您的宝贵时间,如果您能给我任何建议,我将不胜感激,

-画了

// Usage Example: $dbconn = dbManager::getConnection();
//                $dbconn->query("SELECT * FROM accounts WHERE id=:id", "':id' => $id");

<?php

class dbManager {
    private static $dbManagerInstance;
    private $dbConnectionInstance;
    private $stime;
    private $etime;
    public $timespent;
    public $numqueries;
    public $queries = array();

    public static function getManager(){
        if (!self::$dbManagerInstance){
            self::$dbManagerInstance = new dbManager();
        }
        return self::$dbManagerInstance;
    }

    // Server details stored in definition file
    private function __construct($db_server=DB_SERVER, $db_user=DB_USER, $db_pass=DB_PASS, $db_params=array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")) {
        if(!$this->dbConnectionInstance)
        {
            try{
                $this->dbConnectionInstance = new PDO($db_server, $db_user, $db_pass, $db_params);
                $this->dbConnectionInstance->setAttribute(PDO::ATTR_PERSISTENT, PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
                $this->dbConnectionInstance = null;
                die($e->getMessage());
            }
        }
        return $this->dbConnectionInstance;
    }

    private function __destruct(){
        $this->dbConnectionInstance = null;
    }

    private function query($sql, $params = array()) {
        $this->queries[] = $sql;
        $this->numqueries++;
        $this->sTime = microtime();
        $stmt = $this->dbConnectionInstance->prepare($sql);
        $stmt->execute($params);
        $this->eTime = microtime();
        $this->timespent += round($this->eTime - $this->sTime, 4);
        return $stmt;
    }

}

?>

谢谢你们的建议,我现在已经在我的异常处理中添加了回滚和提交,我只是在研究缓冲查询的使用,我不完全确定这会给我带来什么?

【问题讨论】:

    标签: php mysql oop pdo


    【解决方案1】:

    看起来不错,我会添加 rollback 功能以及缓冲查询/错误信息建议(如果您使用的是支持事务的 RDBMS):

    try {
        $this->dbConnectionInstance->beginTransaction();
        $stmt = $this->dbConnectionInstance->prepare($sql);
        $stmt->execute($params);
        $this->dbConnectionInstance->commit();
    }catch(PDOException $e){
        $this->dbConnectionInstance->rollback();
    }
    

    commit() , beginTransaction()

    编辑:在下面添加了有关缓冲查询的更多信息的链接:

    【讨论】:

      【解决方案2】:

      您的代码看起来太糟糕了。但是,如果我可以进行一些小的更改(主要是错误处理)。

      prepare 和 execute 语句都会在出错时返回 false。您可以在上面的示例中从$this-&gt;dbConnectionInstance-&gt;errorInfo() 访问错误。

      如果您打算使用任何大型查询,我建议您使用缓冲查询:PDO::MYSQL_ATTR_USE_BUFFERED_QUERY =&gt; true

      看起来是一个好的开始。祝您的 CMS 好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-20
        • 2015-08-04
        • 2022-10-23
        • 1970-01-01
        • 2016-01-09
        • 1970-01-01
        相关资源
        最近更新 更多