2012-11-15 115 views
0

在這段代碼我嘗試extendo PDO錯誤擴展PDO類

class mypdo extends PDO{ 

    static public $db = null; 

    public function __construct($dsn, $username=false, $password=false){ 
     if(self::$db==null){ 
      try {    
       self::$db = parent::__construct($dsn, $username, $password); 
       self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      } catch (PDOException $e) { 
       die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>"); 
      } 
     } 
     return self::$db; 
    } 
} 

當我打電話

$db = new mypdo(<here my DSN>,<here my user>,<here my password>); 

我得到這個錯誤

Fatal error: Call to a member function setAttribute() on a non-object

的錯誤是在這一行

self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

setAttribute()是一個PDO對象的方法,爲什麼會出現這個錯誤?

當我加入這個方法的類我PDO

public function lastInsertId($name) { 
    return self::$db->lastInsertId($name); 
} 

,如果我嘗試調用它,我得到同樣的錯誤消息

我認爲正確的代碼是

class mypdo extends PDO{ 

    static public $db = null; 

    public function __construct($dsn, $username=false, $password=false){ 
     if(self::$db==null){ 
      try {    
       parent::__construct($dsn, $username, $password); 
       parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      } catch (PDOException $e) { 
       die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>"); 
      } 
     } 
     return self::$db; 
    } 

    public function runSQL($SQL) { 
     return parent::exec($SQL); 
    } 

    public function lastInsertId($name) { 
     return parent::lastInsertId($name); 
    } 

} 
+0

嘗試self :: $ db = new PDO($ dsn,$ username,$ password);而不是self :: $ db = parent :: __構造($ dsn,$ username,$ password); – Bgi

回答

3

在PHP中,對象構造函數(在這種情況下爲PDO)通常不會返回值。

當你做以下幾點:

self::$db = parent::__construct($dsn, $username, $password); 

如果PDO構造(parent::__construct())沒有返回值,你設置self::$dbnull - 值。這就是爲什麼你收到錯誤「調用成員函數setAttribute()對非對象」,因爲null不是一個對象。

爲了測試,你可以嘗試以下方法:

parent::__construct($dsn, $username, $password); 
self::$db = $this; 

這將調用父類的構造函數,然後設置self::$db參考當前實例。

+0

你能告訴'self :: $ db = parent :: __構造($ dsn,$ username,$ password)之間的區別;'和你的 –

+0

其有用的+1 .. –

+0

如果我嘗試self :: $ db = parent: :__ construct($ dsn,$ username,$ password,array(PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION)); – user1640529