2012-03-07 19 views
0

我試圖讓OOP類來獲取用戶信息用戶的信息,但我得到這個錯誤OOP PHP錯誤時,從數據庫中獲得

致命錯誤:調用一個成員函數做準備( )中的functions.php非對象上

user.php的 - >

include_once 'functions.php'; 
$user = new User(); 

echo $user->get_fullname(5); 

的functions.php - >

include_once 'database.php'; 
class User 
{ 
    public function connect() 
    { 
     $dbh = new DB_Class(); 
    } 

    public function get_fullname($uid) 
    { 

     $getName = $dbh->prepare("SELECT EmailAddress FROM users WHERE UserID =:username"); 
     $getName->bindParam(':username', $uid); 
     $getName->execute(); 
     $rowName = $getName->fetch(); 
     $email = $rowName['emailaddress']; 
     return $email; 

    }  
} 

database.php文件 - >

class DB_Class 
{ 
    public function connect() { 
     try { 
      $dbh= new PDO("mysql:host=localhost;dbname=root",'users','password', array(
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
       PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" 
      )); 
     } catch (PDOException $e) { 
      echo $e->getMessage(); 
     } 

     $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); 
     $dbh->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER); 
    } 

} 

我在做什麼錯:(

回答

1

你從來沒有真正賦予訪問PDO 。例如$dbh的東西youre設法在使用它,它使用了類好像您選擇簡單的功能分組,但也期待一些魔術發生:-)這就是我如何與您的existingcode做到這一點:

class DB_Class { 

    protected $dsn; 
    protected $user; 
    protected $password; 

    protected $connection; 

    public function __construct($dsn = null, $user = null, $password = null) 
    { 
     $this->dsn = $dsn; 
     $this->user = $user; 
     $this->password = $password; 
    } 

    public function connect() 
    { 
     if($this->connection) { 
     return $this->connection; 
     } 

     try { 
     $this->connection = new PDO($this->dsn,$this->user, $this->password, 
      array(
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
       PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" 
     )); 

     $this->connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); 
     $this->connection->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER); 

     return $this->connection; 
     } 
     catch (PDOException $e) { 

      return false; 
     } 

    } 
} 

class User { 
    protected $db; 

    public function __construct(DB_Class $db = null) 
    { 
     $this->db = $db; 
    } 

    public function setDb(DB_Class $db) 
    { 
     $this->db = $db; 
    } 



    public function get_fullname($uid) 
    { 
     $stmt = $this->db->connect()->prepare("SELECT EmailAddress FROM users WHERE UserID =:username"); 
     $stmt->execute(array(':username', $uid)); 
     if($row = $getName->fetch()) { 
      return $row['emailaddress']; 
     } else { 
      return null; 
     } 
    } 

} 
+0

仍然顯示錯誤.. – Ben 2012-03-07 20:58:30

+0

我看到你編輯的代碼,但stil它顯示致命錯誤:調用一個非對象 – Ben 2012-03-07 21:07:27

+0

成員函數connect()你創建了一個新的'DB_Class'實例並將它傳遞給' User'? '$ user = new User(new DB_Class('your dsn','your_username','your_password')); echo $ user-> get_fullname();' – prodigitalson 2012-03-07 21:07:57

0

$dbh變量沒有被傳遞到get_fullname功能。你需要做這樣的事情:

public function connect() 
{ 
    $dbh = new DB_Class(); 
    return $dbh; 
} 

public function get_fullname($uid) 
{ 
    $dbh = $this->connect(); 
+0

另一個錯誤:致命錯誤:調用未定義的方法DB_Class :: prepare()in functions.php – Ben 2012-03-07 20:43:58

0

需要聲明$胸徑爲通過$ User類的屬性和訪問這個標識符:

class User 
    { 
protected $dbh; 
    public function connect() 
    { 
    $this->dbh = new DB_Class(); 
    } 

    public function get_fullname($uid) 
    { 

$getName =$this->dbh->prepare("SELECT EmailAddress FROM users WHERE UserID =:username"); 
$getName->bindParam(':username', $uid); 
$getName->execute(); 
$rowName = $getName->fetch(); 
    $email = $rowMail['emailaddress']; 
    return $email; 

    } 

    } 
+0

另一個錯誤:致命錯誤:調用未定義的方法DB_Class :: prepare()在functions.php – Ben 2012-03-07 20:47:09

+1

它取決於什麼級別你想要實現什麼樣的抽象。如果你設計類特殊DB_class低層次的互動與數據庫是有意義的這一類中incapsulate DB-quiries。此模型中的類用戶不應該知道任何關於數據庫層的物理屬性,它應該只包含業務邏輯。用幾句話來形容很難。 – heximal 2012-03-07 21:04:31

0

你從來沒有真正賦予你的類屬性的屬性,聲明你的方法中的變量時,將它們放入方法電流範圍內的所有你正在做的,一旦方法執行結束後,他們被摧毀。

要正確設置類中的屬性,您需要使用$this->varname來聲明它們,訪問它們也是一樣。

您同時還使用了不正確的名稱類建築,構造函數必須設置爲__constructconnect

正如你可以在更新的代碼中看到現在$dbh變量是用戶類的屬性,並可以將它的方法之間調用。

用戶類別

class User 
{ 
    public function __construct() 
    { 
     $this->dbh = new DB_Class(); 
    } 

    public function get_fullname($uid) 
    { 

     $getName = $this->dbh->getConnection()->prepare("SELECT EmailAddress FROM users WHERE UserID =:username"); 
     $getName->bindParam(':username', $uid); 
     $getName->execute(); 
     $rowName = $getName->fetch(); 
     $email = $rowName['emailaddress']; 
     return $email; 

    }  
} 

數據庫類

class DB_Class 
{ 
    public function __construct() { 
     try { 
      $this->dbh = new PDO("mysql:host=localhost;dbname=root",'users','password', array(
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
       PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" 
      )); 
     } catch (PDOException $e) { 
      echo $e->getMessage(); 
     } 

     $this->dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); 
     $this->dbh->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER); 
    } 

    public function getConnection() { 
     return $this->dbh; 
    } 
} 

您將使用http://us2.php.net/manual/en/oop5.intro.php作爲資源大大受益。

+0

致命錯誤:調用成員函數prepare()再次對非對象:X – Ben 2012-03-07 22:06:56

+0

答案已更新,因爲我忽略了正在建造你的班級。 – Nick 2012-03-07 22:09:16

+0

如果我使用編輯後的代碼,錯誤是:致命錯誤:調用未定義的方法DB_Class :: prepare().. – Ben 2012-03-07 22:12:05