2012-03-07 26 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