【问题标题】:what is the error using OOPS with PDO使用带有 PDO 的 OOPS 有什么错误
【发布时间】:2012-01-09 19:13:36
【问题描述】:

我正在学习 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 我得到了这个

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

谢谢。

【问题讨论】:

    标签: php oop pdo


    【解决方案1】:

    User 对象中,$this-&gt;db 是对DB 类对象的引用。这个类没有实现prepare方法,所以当你尝试用$stmt = $this-&gt;db-&gt;prepare($qry);调用它时没有可用的方法。

    如果你坚持你当前的类设计,你需要创建这样一个函数:

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

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

    【讨论】:

    • 我真的不想坚持当前的班级设计。您能否建议标准代码需要进行哪些修改。
    • 我有点困惑,是否有必要向我启动的每个新课程发送$dbh?像这样$obj_user = new User($dbh); 还是有其他方法?
    • 好吧,我会忘记使用您自己的 DB 类而只使用 PDO 对象:这应该非常适合您的需求。
    • 表示在每个类的构造函数中,我需要创建 PDO 对象??
    • @diEcho 任何需要数据库访问的对象都需要提供数据库对象。最好的方法是在创建对象时传递它。你的方法是最简单的:从长远来看,你可能想看看依赖注入模式,这可能是解决问题的最可持续的方法。
    猜你喜欢
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2013-12-10
    • 2013-01-13
    • 2013-06-06
    相关资源
    最近更新 更多