2014-01-13 31 views
1
require("classes/controller.class.php"); 

$db = new mysqli(__DBHOST, __DBUSER, __DBPASS, __DBDATA); 
if ($db->connect_errno) { 
    printf("Connect failed: %s\n", $db->connect_error); 
    exit(); 
} 

$controller = new Controller; 

Controller類中,我想使用$db MySQLi連接。所以公共職能中我使用:使用基於類的MySQLi對象

$result = $db->query("SELECT * FROM colors"); 

var_dump($result); 

但我得到這個錯誤:

Fatal error: Call to a member function query() on a non-object in /home/cloud/public/teamdresser/controllers/IndexController.php on line 8 

難道我做錯了什麼?我需要先通過$db連接,還是使用全局或其他?

在此先感謝

回答

2

如果$db是一個全局變量,您需要將它導入你的函數:

public function YourFunction() 
    { 
    global $db; 

    $result = $db->query("SELECT * FROM colors"); 
    .. 
    } 

而不是做這個的,你可能要考慮在封裝$分貝一個數據庫類並將其作爲單例創建,或者更好地將其傳遞給Controller的構造函數。但是這種說法可能會引發關於設計的新的討論,而關於這個主題的完整書籍已經寫出來了。所以現在,只需像上面描述的那樣導入全局。 ;)

+0

正如我在想我自己,謝謝!像魅力一樣工作。我想太難了:p –

2

你可以使用一類具有單一實例

class Database { 

    private static $_instance; 

    public static function getInstance() { 

     //If the connection is not initialized, this creates it and store 
     if (empty(Database::$_instance)) 
      Database::$_instance = new Database(); 
     return Database::$_instance; 
    } 

    private $_db; 

    private function __construct() { 
     $this->_db = new mysqli(__DBHOST, __DBUSER, __DBPASS, __DBDATA); 

     if ($db->connect_errno) { 
      printf("Connect failed: %s\n", $db->connect_error); 
      exit(); 
     } 
    } 

    private function __destruct() { 
     $this->_db->close(); 
    } 

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

} 

你以這種方式

$result = Database::getInstance()->query("SELECT * FROM colors"); 

叫你已經創建了一個連接和調用一個函數執行。一旦腳本終止,連接將由析構函數自動銷燬。

這應該只是一個起點。您可以創建您想要的所有功能(例如,轉義參數,插入,更新,刪除等等......)

+0

謝謝Ruben的補充! –