2011-02-27 41 views
1

我是新來的PDO,我有一個非常簡單的問題。我有一個簡單的功能連接到數據庫:使用PDO對象 - MySQL

function connectDB() 
    { 
     try { 
      $dbh = new PDO('mysql:host='.Config::$db_server.';dbname='.Config::$db_name, Config::$db_login, Config::$db_password, array(
       PDO::ATTR_PERSISTENT => true 
      )); 
      $dbh->exec("SET CHARACTER SET utf8"); 
      $dbh = null; 
     } catch (PDOException $e) { 
      print "Error!: " . $e->getMessage() . "<br/>"; 
      die(); 
     } 
    } 

在調用此函數後,我成功地連接到數據庫。後來嘗試使用$ dbh-> query發送查詢時,我得到了「對非對象調用成員函數query()」。我明白這一點 - 目前我沒有這個課的實例。但唯一能夠實現的就是再次使用$ dbh = new PDO(「settings」),這有點愚蠢是不是?功能沒有意義。我試圖在connectDB函數中返回$ dbh(在NULL語句之前),但它並沒有真正起作用。

這應該如何正確完成?

回答

1

這取決於你的應用程序的體系結構,但我相信,你應該讓數據庫處理一個類變量,在構造函數中初始化它,並在以後使用它。

class DatabaseAccess{ 
    private $_db; 
    public function __construct(){ 
     try { 
      $this->_db = new PDO('mysql:host='.Config::$db_server.';dbname='.Config::$db_name, Config::$db_login, Config::$db_password, array(
       PDO::ATTR_PERSISTENT => true 
      )); 
      $this->_db->exec("SET CHARACTER SET utf8"); 
      //notice I removed "= null" part 
     } catch (PDOException $e) { 
      print "Error!: " . $e->getMessage() . "<br/>"; 
      die(); 
     } 
    } 

    public function getSomething(){ 
     //run your query here: 
     return $this->_db->query(''); 
    } 
} 
+0

Got it!感謝您的時間。 – tsusanka 2011-02-27 10:27:13

0

您需要刪除函數中的$dbh = null;句子。有了這句話,你就用空值覆蓋了連接,所以隨後你會做$dbh->query(),就像做null->query()一樣,並且出現錯誤。

此外,您需要保存處理程序,或者在代碼退出該函數後它會丟失。在函數的末尾添加一個return $dbh;或將其包裝在一個類中。