PDO连接对象未传递给类

时间:2013-08-12 22:30:53

标签: php class object pdo

好的,2个单独的php文件,一个是主脚本,另一个是类。我正在尝试使用PDO连接到SQL数据库。我在主脚本中创建PDO连接,然后将其传递给另一个脚本中的一个类,在那里进行查询。但是,我收到以下错误:

Fatal error: Call to a member function prepare() on a non-object in /Applications/XAMPP/xamppfiles/htdocs/test/class.php on line 16

我的理解是PHP可以跨脚本传递对象的引用,但是错误说该对象不存在。

下面是主要的PHP脚本,创建PDO对象并传递给要播放的类。

<?php
session_start();
unset($_SESSION['reference']);

require('class.php');

//connect to database, I know that username and password are not included

$dsn = 'mysql:dbname=test;host=localhost';

try {
    $dbh = new PDO($dsn);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
  die ( 'Connection failed: ' . $e->getMessage() );
}

$objReference = new reference($dbh);
$reference = $objReference->getReference();


$_SESSION['reference'] = $reference;
session_write_close();

?>

下面是class.php文件。接收对象并获取数据。

<?php

class reference 
{

    private $reference;
    private $dbh;

    public function __construct($dbh) {
        $this->dbh=$dbh;
        $this->setReference();
    }

    private function setReference() {
            $refid=$dbh->prepare(" SELECT MAX(id) FROM createX "); 
            $refid->execute();
            $id = $refid->fetchColumn();
            $id=$id+1;
            $this->reference = $id;
    }

    public function getReference() {
         return $this->reference;
    }

}

?>

是否有另一种方法将PDO对象传递给我不知道的类?谢谢大家。

2 个答案:

答案 0 :(得分:2)

由于$dbh是一个实例变量,因此在setReference函数中,您应该使用伪$this来引用它:

$refid=$this->dbh->prepare(" SELECT MAX(id) FROM createX "); 

即。使用$this->dbh

答案 1 :(得分:0)

您收到该错误的原因是您的数据库连接失败。当您尝试实例化PDO对象时,您似乎忘记了传递密码参数。

如果您暂时注释掉try / catch块,您将收到更详细的错误消息,这可能会证明是这种情况。

当您完成数据库连接后,我会执行以下操作:

  1. 创建一个dbconnection类。
  2. 使PDO对象成为该类的受保护成员。
  3. 让您的模型类扩展dbconnection类,从而为他们提供对db连接的访问​​。
  4. 它非常简单且更安全,但首先要解决您的数据库连接问题。