【问题标题】:PHP OOP Call to a member function prepare() on a non-object [duplicate]PHP OOP调用非对象上的成员函数prepare()[重复]
【发布时间】:2015-05-22 10:12:14
【问题描述】:

我正在使用 PHP OOP 做一个项目。但我收到错误:致命错误:在第 12 行的 ..../PhotoSection.php 中调用非对象上的成员函数 prepare()。 以下是我的源代码。

用于连接数据库的类 DatabaseAdapter

<?php

class DatabaseAdapter {

    protected $_pdo;

    function connect() {
        if (!$this->_pdo) {
            try {
                $this->_pdo = new PDO("mysql:host=localhost;dbname=xxx", "xxx", "123456");
                $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $this->_pdo->exec("SET CHARACTER SET utf8");

                $this->_pdo->exec("set character_set_client='utf8'");
                $this->_pdo->exec("SET character_set_results='utf8'");
                $this->_pdo->exec("SET collation_connection='utf8_general_ci'");
            } catch (PDOException $e) {
                echo $e->getMessage();
                exit;
            }
        }
    }

    function disconnect() {
        $this->_pdo = null;
    }

}

类数据库业务

require 'DatabaseAdapter.php';

class DatabaseBusiness extends DatabaseAdapter {

    protected $_table = "";
    protected $_primaryKey = "";

    function __construct() {
        parent::connect();
    }

    function __destruct() {
        parent::disconnect();
    }

}

类 PhotoSection

<?php

class PhotoSection extends DatabaseBusiness {

    function __construct() {
        $this->_table = "photo_section";
        $this->_primaryKey = "id";
    }

    function selectAll() {
        try {
            $stmt = $this->_pdo->prepare("select * from ?");
            $stmt->execute(array($this->_table));
        } catch (PDOException $ex) {
            echo $ex->getMessage();
            exit();
        }

        return $stmt->fetchAll();
    }

}

现在我包含在模板中以显示数据

<?php
include_once 'libraries/DatabaseBusiness.php';
include_once 'libraries/PhotoSection.php';
$photoSection = new PhotoSection();
$photos = $photoSection->selectAll();
?>

我已经阅读了重复的问题,但是我已经在 DatabaseAdapter 中声明并初始化了 _pdo 并对其进行了扩展,所以我不知道为什么会出错。 感谢您的帮助

【问题讨论】:

  • 旁注:不能绑定表名
  • @Ghost 谢谢。这是我的错误。我会编辑。
  • 在 PhotoSection 类中添加“parent::__construct()”就可以了
  • @yip 这正是我所需要的。太感谢了。 :)

标签: php database oop pdo


【解决方案1】:

你需要了解php中受保护的关键字:

当我们想让您的变量/函数仅在扩展当前类(包括其父类)的所有类中可见时,我们使用受保护范围

把这个protected $_pdo; 变成global $_pdo; 在您的 DatabaseAdapter 文件中。

【讨论】:

  • 是的。我在 DatabaseAdapter 中使用受保护的 $_pdo。 DatabaseBusiness 扩展 DatabaseAdapter 和 PhotoSection 扩展 DatabaseBusiness。所以我认为 PhotoSection 可以使用 $_pdo,我哪里错了?
  • 我说请把它改成全局的,看看能不能解决问题
  • 我知道你的解决方案可以解决我的问题,但我的错误是没有调用 connect() 函数,所以 $_pdo 没有初始化。无论如何,谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
相关资源
最近更新 更多