2012-11-18 81 views
2

嗨,大家好,我的代碼有問題。與__construct()我得到致命錯誤:調用成員函數prepare()在一個非對象,但沒有它我的代碼正在工作。調用成員函數prepare()在PDO中的非對象

class Animals{ 

public $db_fields; 

public function __construct(){ 
    $this->db_fields = $this->get_fields(); 

    foreach($this->db_fields as $field){ 
    $this->$field = ""; 
} 


public function get_fields(){ 
    global $dbh; 

    $q = $dbh->prepare("DESCRIBE animals"); 
    $q->execute(); 
    $db_fields = $q->fetchAll(PDO::FETCH_COLUMN); 

    return $db_fields; 
} 
} 
$f = new Animals(); 

/*** mysql hostname ***/ 
$hostname = 'localhost'; 
/*** mysql username ***/ 
$username = 'root'; 
/*** mysql password ***/ 
$password = ''; 
/*** mysql database***/ 
$dbname = 'animals'; 

try { 
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); 
/*** echo a message saying we have connected ***/ 
echo 'Connected to database <br />'; 

$dbh = null; 
} 
catch(PDOException $e) 
{ 
echo $e->getMessage(); 
} 

我只想讓我的字段(animal_id,animal_type,animal_name)上班一樣

public $animal_id; 
public $animal_type; 
public $animal_name; 
+0

刪除'$ dbh = null;',否則就是覆蓋PDO對象。 – air4x

回答

0

你必須實例化Animals對象後創建$dbh,否則它沒有定義在get_fields()函數中。

$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); 
$f = new Animals(); 

話雖這麼說,更好的設計是使用依賴注入,併發送$dbh對象的類,像這樣:

$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); 
$f = new Animals($dbh); 

所以,你更新的類會是什麼樣子:

class Animals{ 

    private $dbh; 

    public function __construct($dbh){ 
     $this->dbh = $dbh; 
    } 

    public function get_fields(){ 
     $q = $this->dbh->prepare("DESCRIBE animals"); 
    } 
} 

好處?你擺脫了global變量。通常情況下,需要一個全局變量是一個糟糕的設計,你想避免它。你可以看到爲什麼只是基於你遇到的問題 - 它需要設置一個全局狀態才能運行。

相關問題