2012-09-15 198 views
0
<? 
class DbConn { 
    const DB_HOST = 'localhost'; 
    const DB_USER = 'root'; 
    const DB_PASS = 'pw'; 
    const DB_NAME = 'db'; 

    static private $instance = NULL; 
    private $_db; 

    static function getInstance() 
    { 
     if (self::$instance == NULL) 
     { 
     self::$instance = new DbConn(); 
     if(mysqli_connect_errno()) { 
      throw new Exception("Database connection failed: ".mysqli_connect_error()); 
     } 
     } 
     return self::$instance; 
    } 

    private function __construct() 
    { 
     $this->_db = new mysqli(self::DB_HOST, self::DB_USER, self::DB_PASS, self::DB_NAME) or die('Couldnt connect'); 
    } 

    private function __clone() {} 

} 

DbConn::getInstance()->query(); 

?> 

我只是學習,知道我得Singleton模式,我試着用單使自己的數據庫連接類,但是當我試圖執行它,它給調用DbConn時的錯誤: :的getInstance() - >查詢();說調用未定義的方法DbConn :: query()我做錯了什麼?的mysqli和辛格爾頓

+0

重要錯誤?它指向PHP或其他什麼? – Diego

回答

1

嘗試__construct功能

public function query($sql) 
{ 
    return $this->_db->query($sql); 
} 

後加入以下然後嘗試

DbConn::getInstance()->query("SELECT * FROM Table"); //Replace your sql 
2

您正在致電query()DbConn類 - 這沒有任何query()方法的對象。

單例模式的實現在你的例子中是很好的。但你不能直接調用DbConn對象的mysqli功能,你必須包裝他們或爲私營_db屬性爲getter,並在對象調用query()

+0

你是什麼意思? –

+0

我的意思就像你接受的答案一樣。 – gd1

0

你必須

  • 擴展的mysqli類中使用的方法從該類
  • 或編寫一個查詢方法自己。
  • 或使$ DB公衆和使用DbConn::getInstance()->$db->query();

爲什麼讓一個Singleton? mysqli做連接池,並使其成爲一個單身人士添加額外的複雜性沒有任何好處。

0

我在此很新,所以糾正我,如果我錯了。

難道你不能簡單地擴展mysqli類並修改一下構造器嗎?

class DbConn { 

成爲

class DbConn extends mysqli { 


和:

$this->_db = new mysqli(
    self::DB_HOST, 
    self::DB_USER, 
    self::DB_PASS, 
    self::DB_NAME) or die('Couldnt connect'); 

成爲

parent::__construct(
    self::DB_HOST, 
    self::DB_USER, 
    self::DB_PASS, 
    self::DB_NAME) or die('Couldnt connect'); 


現在, DbConn::getInstance()->query();應該工作