2013-04-27 16 views
0

所以我有兩個文件涉及這個問題。其中一個是Database類,另一個是include_once Database文件,然後繼續實例化該類的對象以調用函數 - getDB();. 這就是它出錯的地方。PDO,PHP:試圖實例化對象以調用函數 - 空白頁

數據庫類:

<?php 
    class Database {   
    private static $datasource='mysql:host=localhost; dbname=db_name'; 
    private static $username='root'; 
    private static $password='root'; 
    private static $db;  

    private function __construct(){} 

    public static function getDB(){ 
     if(!isset(self::$db)){ 
     try{ 
      self::$db=new PDO(self::$datasource,self::$username,self::$password); 
     } 
     catch(PDOExceptin $e) { 
      $error=$e->getMessage(); //variable $error can be used in the database_error.php file 
      //display database error file. 
      //include('database_error.php'); 
      exit();    
     } 
     } 
     return self::$db;  
    } 

    function Database(){ 
     return new Database; 
    } 

    } 

    ?> 

而在我的主文件,我這樣做:

<?php 
    include('partials/header.php'); 
    include_once('functions/pdo.php'); 

    $database = new Database(); 
    $getdb = $database->getDB(); 

    //Anything below won't show because of the failed instantiation of Database object above. 
    //code.. 
?> 

很顯然,我在這裏做得不對。我使用php 5.3運行MAMP。 如何正確使用我的數據庫?我之所以具有相同名稱的函數作爲類是因爲我讀了那麼你可以用函數的對象,而不是,但我沒有得到這兩種工作...

+0

'的var_dump($ E);'退出前... – 2013-04-27 18:32:36

回答

1

PDOExceptin應該是PDOException

此外,它有助於打開display_errors並在開發時安裝xdebug。

+0

THX的意見。 – Majoren 2013-04-27 18:41:34

2

你有幾個錯誤,在這裏(使用ini_set("display_errors", 1); error_reporting(-1);看到所有的錯誤消息):

異常類PDO的被命名爲PDOException而不是PDOExceptin

您可以從非靜態上下文中調用靜態函數:$database->getDb()其中,getDb是一種靜態方法。 (寫Database::getDb()

你寫new Database這將導致致命的錯誤,因爲構造函數是私有的(並且命名構造函數的優先級比魔術方法低)。使用方法:

$getdb = Database::Database(); // and declare your Database method as static 
1

很顯然,我在這裏做得不對。

是的。你寫的代碼太多了。
你寫的代碼越多,錯誤就越多。所以,剛剛擺脫所有無用的代碼:

class Database {   
    private static $datasource='mysql:host=localhost; dbname=db_name'; 
    private static $username='root'; 
    private static $password='root'; 
    private static $db;  

    public static function getDB(){ 
     if(!isset(self::$db)){ 
      self::$db=new PDO(self::$datasource,self::$username,self::$password); 
     } 
     return self::$db;  
    } 
} 

,並呼籲它這樣

$db = Database::getDB(); 
+0

然後,有一天他需要兩個數據庫實例,而且...... huhoh。 :D – 2013-04-27 18:43:03

+0

@Denis兩個數據庫實例?爲什麼?沒有任何意義,有多個實例...(如果你不需要操縱不同服務器的數據,這是非常罕見的情況) – bwoebi 2013-04-27 18:43:55

+0

@bwoebi:這取決於你使用的應用程序, '你在做,是否決定通過分割你的數據庫來進行擴展等。 – 2013-04-27 18:54:09