使用OOPS与PDO的错误是什么

时间:2012-01-09 19:13:37

标签: php oop pdo

我正在学习 OOPS 概念并且还使用PDO,但实际上遇到了非常基本的问题,请查看我的代码并告诉我我做错了什么以及如何优化这个代码。

class.db.php

class DB
{
    public $dbh;
    private $qry;

    public function __construct($user ='root',$pass = '')
    {
        try {
            $this->dbh = new PDO('mysql:host=localhost;dbname=parixan',$user,$pass);
            $this->dbh->exec("SET CHARACTER SET utf8"); 
            echo "connected";
        } catch(Exception $e){
            die("Unable to connect: " . $e->getMessage());
        }       
    }
} 

class.user.php

class User
{
    public $db;
    protected $_table ='tbl_user';
    public function __construct($dbh)
    {
        $this->db = $dbh;       
    }
    public function getUserDetails($id) //line #10
    {
        $qry = "SELECT * FROM $this->_table WHERE id = :userID LIMIT 1";
        $stmt = $this->db->prepare($qry); //line #13
        $stmt->bindParam(':userID',$id,PDO::PARAM_INT);  
        if ($stmt->execute()) {
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo "<pre>";print_r($row);
        }
    }

    }

}

user.php的

include_once('class.user.php');
include_once('class.db.php');
$dbh = new DB();
$obj_user = new User($dbh);
$obj_user ->getUserDetails(1);

在运行user.php时我得到了这个

  

connected致命错误:调用未定义的方法DB :: prepare()in   第13行的C:\ xampp \ htdocs \ oops \ class.user.php

感谢。

1 个答案:

答案 0 :(得分:2)

User对象中,$this->db是对DB类对象的引用。此类未实现prepare方法,因此当您尝试使用$stmt = $this->db->prepare($qry);调用时,没有可用的方法。

如果坚持使用当前的类设计,则需要创建这样的函数:

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

这意味着您现在将拥有一个PDOStatement对象,您可以在其上调用bindParamexecute