致命错误:在非对象上调用成员函数query()

时间:2014-04-30 17:27:17

标签: php class oop

这是我的基础数据库类:

class _getDatabase
{
    private $db;

    function __construct(PDO $connection)
    {
        $this->db = $connection;
    }

    /* Selection wrapper*/

    public function getSelected($requestDatabase, $arguments)
    {

        foreach ($requestDatabase as $getBranchDatabase) {
        $this->db->query('USE '. $getBranchDatabase); //error on this line
        $sql = $this->db->prepare($arguments['query']);
        $sql->execute(array(
            $arguments['parameters']
        ));
        return $sql->fetchALL(PDO::FETCH_OBJ);
      }
    }

}

$dbh = new PDO('XXXXX');
$dbFactory = new _getDatabase($dbh);

这是我的孩子班:

function __autoload($classname)
{
    $filename = "../database/" . $classname . ".php";
    include_once($filename);
}
class _getBranch extends _getDatabase
{
    public $requestDatabase = array();

    public function __construct(array $selectedBranch)
    {

        $this->branch = $selectedBranch;

    }

    public function getBranch($query)
    {
        parent::getSelected($this->branch, $query);
    }
}
$setDbObject = new _getBranch(array(
    "esoftcar_jaf",
    "esoftcar_jaf"
));
$arguments = array();
$arguments['query']      = 'SELECT * FROM `branches` WHERE B_CODE = ?';
$arguments['parameters'] = 'AMB';
var_dump($setDbObject->getBranch($arguments)); 

现在我收到以下错误:

  

PHP致命错误:在非对象上调用成员函数query()

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您的数据库连接失败,因为$this->db不存在。

您从父级调用getSelected()方法是好的,但是$ this-> db值永远不会被声明和启动,因为没有调用父构造函数。

__construct()中使用

parent::__construct($connection);

解决这个问题。

答案 1 :(得分:1)

错误告诉您__getDatabase类的$ db属性未初始化,这是因为您没有将db连接传递给子类的父类构造函数。

当你创建子类时,它并没有神奇地使用你在$ dbFactory行中创建的父类。

一种可能的解决方案是在子类构造函数中初始化连接并将其传递给父类构造函数。