在类中使用MySQLi对象

时间:2014-01-13 13:10:43

标签: php

require("classes/controller.class.php");

$db = new mysqli(__DBHOST, __DBUSER, __DBPASS, __DBDATA);
if ($db->connect_errno) {
    printf("Connect failed: %s\n", $db->connect_error);
    exit();
}

$controller = new Controller;

Controller类中,我想使用$db MySQLi连接。所以在我使用的公共函数中:

$result = $db->query("SELECT * FROM colors");

var_dump($result);

但是我收到了这个错误:

Fatal error: Call to a member function query() on a non-object in /home/cloud/public/teamdresser/controllers/IndexController.php on line 8

我做错了吗?我是否需要首先传递$db连接,或使用全局或其他东西?

提前致谢

2 个答案:

答案 0 :(得分:2)

如果$db是全局变量,则需要在函数中导入它:

  public function YourFunction()
  {
    global $db;

    $result = $db->query("SELECT * FROM colors");
    ..
  }

您可能需要考虑将$ db封装在数据库类中并将其创建为单例,或者更好地将其传递给Controller的构造函数,而不是这样做。但这句话可能会引发关于设计的新讨论,而关于这个主题的完整书籍已经写完了。所以现在,只需像上面描述的那样导入全局。 ;)

答案 1 :(得分:2)

您可以使用具有单例实例的类

class Database {

    private static $_instance;

    public static function getInstance() {

        //If the connection is not initialized, this creates it and store
        if (empty(Database::$_instance))
            Database::$_instance = new Database();
        return Database::$_instance;
    }

    private $_db;

    private function __construct() {
        $this->_db = new mysqli(__DBHOST, __DBUSER, __DBPASS, __DBDATA);

        if ($db->connect_errno) {
            printf("Connect failed: %s\n", $db->connect_error);
            exit();
        }
    }

    private function __destruct() {
        $this->_db->close();
    }

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

}

你以这种方式打电话

$result = Database::getInstance()->query("SELECT * FROM colors");

您已创建连接并在调用函数时执行。脚本终止后,连接将由析构函数自动解决。

这应该只是一个起点。您可以创建所需的所有功能(例如转义参数,插入,更新,删除等等)