2016-04-25 59 views
1

我在index.php文件中有一個到數據庫的PDO連接。在index.php文件中寫入數據庫連接

$servername = "localhost"; 
$username = "root"; 
$password = ""; 
$dbname = "dbname"; 
$dbh_conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 
$dbh_conn->exec("set names utf8"); 
$dbh_conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbh_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

我的網站幾乎所有頁面都需要數據庫。還有幾頁不需要數據庫,但是因爲所有頁面都從index.php傳遞過來,所以該連接執行。我的意思是所有頁面(即使那些不需要數據庫的頁面)有一個數據庫連接。

這是件壞事嗎?我應該改變我的所有結構嗎?同樣,大部分頁面都需要數據庫,其中只有少數不需要。那麼,我做得很好嗎?

+0

將db連接添加到新文件並將其包含在任何需要db連接的頁面中 - 如果細節發生更改,或者您需要以某種方式調整連接,可節省大量編輯 – RamRaider

+0

連接到所有頁面上的數據庫使其更有可能成爲您會遇到數據庫的連接限制。您應該只在真正使用數據庫的頁面中執行此操作。 – Barmar

+0

@Barmar來吧,我們所有的網站都做得完全一樣。達到極限的原因不是所有頁面上的連接。 –

回答

1

您需要爲DB連接創建一個singleton類,而不僅僅是運行代碼。

class DB { 
    private static $instance; 
    private $_dbh_conn = null; 

    public static function getInstance() { 
     if (null === static::$instance) { 
      static::$instance = new static(); 
     } 

     return static::$instance; 
    } 

    protected function __construct() { 
     $servername = "localhost"; 
     $username = "root"; 
     $password = ""; 
     $dbname = "dbname"; 
     $this->_dbh_conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 
     $this->_dbh_conn->exec("set names utf8"); 
     $this->_dbh_conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
     $this->_dbh_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 

    public function &dbh_conn() { 
     return $this->_dbh_conn; 
    } 

    private function __clone() { } 
    private function __wakeup() { } 
} 

而當你有這個文件,你需要得到這樣的連接:

$dbh_conn = DB::getInstance()->dbh_conn(); 

現在,你必須在$dbh_conn到數據庫的連接,併爲你做了,你可以只用它到現在。唯一的區別是現在你可以包含這個文件,但是除非你使用Singleton類DB並且特別要求數據庫連接(就像我在上面的例子中那樣),否則它不會連接到數據庫。其他好處是,您在整個腳本運行時獲得相同的數據庫連接,因爲您正在使用單例類的設計模式來獲取連接。