-1

可能重复:
参考 - 这个错误在 PHP 中意味着什么?

我有两节课:

  1. 数据库类
  2. Libtables 类

在数据库类中,我为整个脚本创建了一个使用 mysqli 的对象。当我尝试从 .php 文件中的数据库类调用函数时,它可以工作。

简化的数据库类:

class Database {

protected static $_instance;
protected $_mysqli;
protected $_query;


public function __construct($host, $username, $password, $db) {
    $this->_mysqli = new mysqli($host, $username, $password, $db)
        or die("There was a problem connecting to the database");
}

public function close() {

    $this->_mysqli->close();

}

public function query($q) {
    return $this->_mysqli->query($q);
}

}

但是,当我尝试从 Libtables 类中的数据库类调用函数时,它失败了,并且我收到一个名为的错误:“调用非对象上的成员函数 query()”

简化的 Libtables 类:

class Libtables {

    function getCol($table) {
    $q = "SELECT * from " . $table . ";";
    $res = $db->query($q);
    return $res;
    }

}

我以这种方式创建了一个数据库类对象:

$db = new Database(DB_HOST, DB_USER, DB_PASS, DB_NAME);
global $db;
4

3 回答 3

3

您需要global $db;在 getCol 函数中。

function getCol($table) {
    global $db;
    $q = "SELECT * from " . $table . ";";
    $res = $db->query($q);
    return $res;
}

根据下面的评论进行编辑。

另一种选择是将数据库作为属性存储在类中。以下是一个简化的响应。(您应该考虑使var $db私有并通过构造函数传入。有关更多详细信息,请参阅有关变量范围和对象构造函数的文档。)

class Libtables {

    var $db;

    function getCol($table) {
        $q = "SELECT * from " . $table . ";";
        $res = $this->db->query($q);
        return $res;
    }

}

$oLibtables = new libtables();
$oLibtables->db = $db;
于 2012-10-21T13:26:37.137 回答
1

您遇到的问题与范围有关。该$db变量未在Libtables类中初始化。

您可以通过$db在需要使用它的函数中定义变量 global 来解决此问题,即

class Libtables 
{
    public function getCol($table) 
    {
        global $db;

        $q = "SELECT * from " . $table . ";";
        $res = $db->query($q);

        return $res;
    }
}

或者您可以通过类构造函数注入变量,以便您可以在任何地方使用它(比使用全局变量更简洁的代码)。

class Libtables 
{
    private $_db;

    public function __construct($db)
    {
        $this->_db = $db;
    }

    public function getCol($table) 
    {
        $q = "SELECT * from " . $table . ";";
        $res = $this->_db->query($q);

        return $res;
    }
}

创造Libtables

$db = new Database(DB_HOST, DB_USER, DB_PASS, DB_NAME);
.....
$lib = new Libtables($db);

高温高压

于 2012-10-21T13:32:59.100 回答
0

谢谢大家。它现在可以将数据库对象传递给 libtables 类。

于 2012-10-21T13:47:35.670 回答