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
连接,或使用全局或其他东西?
提前致谢
答案 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");
您已创建连接并在调用函数时执行。脚本终止后,连接将由析构函数自动解决。
这应该只是一个起点。您可以创建所需的所有功能(例如转义参数,插入,更新,删除等等)