从另一个类访问PDO实例

时间:2012-12-27 23:44:07

标签: php class 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);

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

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

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

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

PHP Class Based User System With PDO - Call to a member function prepare() on a non-object这个问题很有意思,但不太了解:/

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

3 个答案:

答案 0 :(得分:3)

您需要将$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');

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您的WHERE子句中出现错误:

WHERE name :name

你错过了一个等号:

WHERE name = :name