2013-04-26 164 views
0

我有下面的类:PDO连接 - 最大连接

<?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()->getConnection();或应我在每一个功能“外包”到一个类变量和访问它像$this->_db;,并尝试?
有什么更好的方法来避免与我的db连接太多?

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

谢谢你的帮助!

回答

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 
    } 
}