0

所以我有两个文件涉及这个问题。其中一个是Database 类,另一个是include_onceDatabase 文件然后继续实例化该类的对象以调用函数--getDB(); 的文件。这就是它出错的地方。

数据库类:

<?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。如何正确使用我的数据库?我有一个与类同名的函数的原因是因为我读到你可以用函数实例化对象,但我也没有让它工作......

4

3 回答 3

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
于 2013-04-27T18:36:54.907 回答
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();
于 2013-04-27T18:40:18.457 回答
1

PDOExceptin应该是PDOException

此外,它有助于在开发时打开 display_errors 并安装 xdebug。

于 2013-04-27T18:33:40.193 回答