【问题标题】:PDO Connections - max connectionsPDO 连接数 - 最大连接数
【发布时间】:2013-04-20 08:27:10
【问题描述】:

我有以下课程:

<?php
class Database {

    protected static $_instance;
    protected $_connection;
    protected $_dbhost=DB_HOST;
    protected $_dbname=DB_DBNAME;
    protected $_username = DB_USER;
    protected $_password = DB_PASS;
    protected $_dbType = "mysql";

    /**
    * Singleton pattern implementation makes "new" unavailable
    */
    protected function __construct()
    {
        $this->_connection = 
            new PDO($this->_dbType . ":host=" . $this->_dbhost . ";dbname=" . $this->_dbname, $this->_username, $this->_password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", PDO::ATTR_PERSISTENT => true));
    }

    public function getConnection()
    {
        return $this->_connection;
    }

    public static function getInstance()
    {
        if (null === self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    /**
    * Singleton pattern implementation makes "clone" unavailable
    */
    protected function __clone()
    {}
}

?>  

发件人:https://stackoverflow.com/a/3010486

现在我有了第二个类,它具有访问数据库的所有功能。

我的问题:
我的脚本中的最大连接数有问题,因此我使用了新的数据库类。在我的助手类中,我这样做:

<?php   
class helper {

    function getAllInvitesFromPlayer($uid) {
        $sql = "SELECT request_id FROM ".DBPREFIX."invites WHERE inviter_id = :uid AND joined = 1";

        try {
            $db = Database::getInstance()->getConnection();
            $stmt = $db->prepare($sql);
            $stmt->bindParam("uid", $uid);
            $stmt->execute();
            $content = $stmt->fetch(PDO::FETCH_LAZY);
            $db = null;
            return $content;
        } catch(PDOException $e) {
            echo $e->getMessage();
        }
    }
}

在“尝试”之后使用$db = Database::getInstance()-&gt;getConnection(); 是否正确,或者我应该将其“外包”给类变量并在每个函数中像$this-&gt;_db; 一样访问它并尝试?
有什么更好的方法可以避免与我的数据库建立过多的连接?

在一个文件中初始化一次帮助类肯定更好,对吧?并不总是调用$helper = new helper(),因为这总是会创建一个新的数据库连接,对吧?

感谢您的帮助!

【问题讨论】:

    标签: php class pdo database-connection


    【解决方案1】:

    没关系。
    只要您使用getInstance(),它始终是同一个连接,无论您以何种方式或在何处调用它。

    为了封装,最好将 db 连接分配给类变量。

    另请注意,您对 try..catch 的使用是错误的。它不应该在那里。

    所以,像这样

    <?php   
    class helper {
    
        protected function __construct()
        {
            $this->db = Database::getInstance()->getConnection();
        }
    
        function getAllInvitesFromPlayer($uid) {
            $sql = "SELECT request_id FROM ".DBPREFIX."invites WHERE inviter_id = ? AND joined = 1";
            $stmt = $this->db->prepare($sql);
            $stmt->execute(array($uid));
            return $stmt->fetchColumn(); // will return one invite actually
            //or
            return $stmt->fetchAll(PDO::FETCH_COLUMN, 0); // will return ALL invites indeed
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2015-06-04
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 2014-02-14
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多