2016-12-15 112 views
1

這是我的數據庫類通過PDO持久連接MySQL的連接:爲什麼持久性PDO連接會與每個請求建立新連接?

class database{ 
    private $_db; 
    public function conn() 
    { 
     $user = 'xxx'; 
     $pass = 'xxxxxxx'; 
     try 
     { 
      $this->_db = new PDO('mysql:dbname=x;host=x.x.x.x',$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',PDO::ATTR_PERSISTENT => true)); 
      $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $this->_db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
      return $this->_db; 
     } 

     catch(PDOException $e) 
     { 
      return "-1"; 
     } 
    } 

} 

我調用這個類中的另一個函數來查詢數據庫。每次我調用函數時,都會在數據庫中創建一個新的連接。爲什麼持續的pdo連接爲每個請求創建一個新的連接?

+2

如果你每次都做$ db = new database(); $ db-> conn();你將創建一個新對象,並且每次都定義一個新連接 – MacBooc

+0

在創建一個新的'conn()'方法之前,'conn()'方法不檢查私有'$ _db'是否爲空連接到你的數據庫。 – WillardSolutions

回答

0

我正在使用我在項目開始時定義的靜態類,唯一不好的部分就是您無法創建多個數據庫。

<?php 

/** 
* 
************************************************ 
*     PlainFramework    * 
************************************************ 
* 
* Created by Niels Hamelink 
* File: class.database.php 
* Created at: 14-11-2016 02:08 
**/ 
class Database 
{ 
    private static $_db; 

    public static function connect($dsn, $username, $password, $debug) 
    { 
     try 
     { 
      $_db = new PDO($dsn, $username, $password); 
     } catch(PDOException $e) 
     { 
      if($debug) 
       Application::throw_error($e->getMessage()); 
     } 
    } 

    public static function close() 
    { 
     $_db = null; 
    } 

    public static function isConnected() 
    { 
     return isset($_db) 
      && $_db != null; 
    } 

    public static function getPDO() 
    { 
     if(!isset($_db)) 
      $_db = null; 

     return $_db; 
    } 

    public static function executeQuery(Query $query) 
    { 
     try 
     { 
      return Database::getPDO()->query($query->toString()); 
     } catch(PDOException $ex) 
     { 
      Application::throw_error($ex->getMessage()); 
     } 
    } 

} 
+0

爲什麼不讓executeQuery()使用prepare/execute而不是查詢? –

+0

另外我很好奇,什麼是查詢類? –

+0

@YourCommonSense我正在使用命名參數,這對於PDO查詢功能是不可能的。 Query類是一個自定義的查詢生成器(字符串生成器),所以我不必編寫查詢。 – DevNiels

1

您需要檢查連接是否已經建立,然後再次連接。這可以通過添加一個快捷的方法到類,你的conn()方法內調用來完成 -

class database{ 
    private $_db; 

    private function isConnected() 
    { 
     return ($this->_db) ? TRUE : FALSE; 
    } 

    public function conn() 
    { 

     if ($this->isConnected()) 
     { 
      return $this->_db; 
     } else { 

      $user = 'xxx'; 
      $pass = 'xxxxxxx'; 
      try 
      { 
       $this->_db = new PDO('mysql:dbname=x;host=x.x.x.x',$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',PDO::ATTR_PERSISTENT => true)); 
       $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
       $this->_db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
       return $this->_db; 
      } 

      catch(PDOException $e) 
      { 
       return "-1"; 
      } 
     } 
    } 

} 

此代碼將返回現有連接(如果存在),或者一個新的,如果它沒有。