Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将OOPS与PDO结合使用会出现什么错误_Php_Oop_Pdo - Fatal编程技术网

Php 将OOPS与PDO结合使用会出现什么错误

Php 将OOPS与PDO结合使用会出现什么错误,php,oop,pdo,Php,Oop,Pdo,我正在学习OOPS的概念,也在使用,但确实陷入了非常基本的问题,请查看我的代码,告诉我我做错了什么,以及如何优化代码 class.db.php class.user.php 在运行user.php时,我得到了这个 连接的致命错误:调用中未定义的方法DB::prepare() 第13行的C:\xampp\htdocs\oops\class.user.php 谢谢。在User对象中,$this->db是对db类对象的引用。此类未实现prepare方法,因此当您尝试使用$stmt=$This->db-

我正在学习OOPS的概念,也在使用,但确实陷入了非常基本的问题,请查看我的代码,告诉我我做错了什么,以及如何优化代码

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

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


谢谢。

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

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


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

我真的不想保留当前的类设计。你能建议标准代码需要做哪些修改吗?我有点困惑,是否有必要将
$dbh
发送给我启动的每个新类??像这样
$obj_user=新用户($dbh)或者有其他方法吗?好吧,我忘了使用自己的DB类,只使用PDO对象:这应该非常适合您的需要。这意味着在每个类的构造函数中,我需要包装PDO对象???@diEcho需要访问数据库的任何对象都需要提供数据库对象。最好的方法是在创建对象时传递它。您的方法是最简单的:从长远来看,您可能希望查看依赖注入模式,这可能是解决问题的最可持续的方法。
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
{
    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);
        }
    }

    }

}
include_once('class.user.php');
include_once('class.db.php');
$dbh = new DB();
$obj_user = new User($dbh);
$obj_user ->getUserDetails(1);
public function prepare($qry) {
    return $this->dbh->prepare($qry);
}