从另一个类访问PDO实例



这是我使用pdo ext连接数据库的db类。

class db
{
    private $host;
    private $dbname;
    private $username;
    private $password;
    public function __construct($host,$db,$name,$pass)
    {
         $this->host=$host;
         $this->dbname=$db;
         $this->username=$name;
         $this->password=$pass;
         $dsn = 'mysql:'.$this->dbname.';'.$this->host;
         try 
         {
            $conn = new PDO($dsn, $this->username, $this->password);

            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         } 
         catch(PDOException $e) 
         {
              echo 'ERROR: ' . $e->getMessage();
         }
 }
}

我在登录类中像这样调用db类…

$host='localhost';
        $db='techy_issue_tracker';
        $name='root';
        $pass='';
        $base= new db($host,$db,$name,$pass);

这里是问题,使一个pdo查询内登录类(扩展db类),如果我使用一行这…

$stmnt = $conn->prepare('SELECT id FROM users WHERE name :name OR email = :email');

生成两个错误,表示..注意:未定义变量:conn…和

在非对象上调用成员函数prepare()

我可以通过简单地把所有的pdo的东西在登录类,但我仍然只是好奇…如何从另一个类调用对象(它是pdo类的实例?)

这个问题很有趣,但是我不太明白:/

我没有经常练习OOP,所以如果有好的解释我会很感激!谢谢。

您需要将$conn初始化为db类的公共属性。

db类的私有属性之后,添加以下内容:

public $conn;

然后,在try catch中,将$conn更改为$this->conn:

$this->conn = new PDO($dsn, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

然后,假设您已经正确地扩展了db类,您可以通过以下方式访问conn:

$stmt = $db->conn->prepare('SELECT id FROM users WHERE name :name OR email = :email');

为什么不直接在db类中添加一个方法,该方法接受sql字符串并返回对象数组。在那个方法中做所有的语句。然后登录类可以调用这个方法来执行任何查询。它不需要知道如何实现数据库连接。这样,如果您将来想要更改底层实现。它只影响db类。不需要对登录类做太多更改,因为所有数据库访问都要通过db类。

WHERE子句错误:

WHERE name :name

你少了一个等号:

WHERE name = :name

最新更新