0

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

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);

这是问题,如果我使用这样的一行,要在登录类(扩展 db 类)中进行 pdo 查询...

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

它产生两个错误,说.. 注意:未定义的变量:conn ...和致命错误:调用非对象上的成员函数prepare()...

我可以通过简单地将所有 pdo 内容放在登录类中来解决这个问题,但我仍然很好奇......你们如何从另一个类调用对象(这是 pdo 类的实例?)。

带有 PDO 的基于 PHP 类的用户系统 - 在非对象上调用成员函数 prepare()这个问题很有趣,但不太了解:/

没有太多练习OOP,所以一些好的解释将不胜感激!谢谢。

4

3 回答 3

3

您需要初始化$conndb类的公共属性。

在您的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');

于 2012-12-27T23:47:18.030 回答
0

您的 WHERE 子句中有一个错误:

WHERE name :name

你错过了一个等号:

WHERE name = :name
于 2014-11-06T14:01:03.480 回答
0

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

于 2012-12-28T00:55:49.257 回答