2

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

4

2 回答 2

2

因为$dbh是一个实例变量,所以在你的setReference函数中你应该使用伪$this来引用它:

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

即使用$this->dbh.

于 2013-08-12T22:38:15.760 回答
0

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

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

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

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

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

于 2013-08-12T22:56:39.273 回答