【问题标题】:PDO connection object not passing to a classPDO 连接对象未传递给类
【发布时间】:2013-08-14 09:33:56
【问题描述】:

好的,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 对象传递给我不知道的类吗?谢谢大家。

【问题讨论】:

  • 看看这是否有帮助:public function __construct(PDO $dbh) {

标签: php class object pdo


【解决方案1】:

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

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

即使用$this-&gt;dbh。

【讨论】:

  • 但是因为他设置了$this->dbh=$dbh;在构造函数中,他应该不能在没有 $this->dbh->prepare 的情况下调用 prepare 吗?
  • @Maximus2012,没有。 $dbh 在这种情况下是未定义的。
  • 知道了。感谢您的澄清。我想我对此有点困惑。
  • 谢谢,这已经解决了。
【解决方案2】:

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

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

当您整理好数据库连接后,我会执行以下操作:

  1. 创建一个 dbconnection 类。
  2. 使 PDO 对象成为该类的受保护成员。
  3. 让您的模型类扩展 dbconnection 类,从而使它们能够访问 db 连接。

这很简单,也更安全,但首先要解决您的数据库连接问题。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2016-01-09
    • 2011-12-17
    相关资源
    最近更新 更多