PHP mysqli"调用非对象的成员函数query()"来自其他班级

时间:2012-10-21 13:23:55

标签: php mysqli

  

可能重复:
  Reference - What does this error mean in PHP?

我有两个班级:

  1. 数据库类
  2. Libtables Class
  3. 在数据库类中,我创建了一个与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;
    

3 个答案:

答案 0 :(得分:3)

您的getCol函数需要global $db;

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

根据以下评论进行修改。

另一种选择是将DB存储为类中的属性。以下是简化的回复。 (您应该考虑将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;

答案 1 :(得分: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);

HTH

答案 2 :(得分:0)

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