我正在尝试重新编写我制作的主页。这次我想使用OOP样式,但我总是得到以下错误:
Statistic :: checkExistingCounter()[statistic.checkexistingcounter]:无法获取MySQL
我做错了什么?我知道准备语句是毫无意义的,但即使只是查询而不是prepare语句根本不起作用。
同样的错误:
无法获取MySQL
我的数据库课程:
class MySQL extends MySQLi {
private static $_instance = null;
private $host, $username, $password, $db;
public static function getInstance() {
if (!(self::$_instance instanceof self)) {
self::$_instance = new self();
}
return self::$_instance;
}
public function __construct(){
$this->host = '...';
$this->username = '...';
$this->password = '...';
$this->database = '...';
$this->connect();
}
public function __destruct() {
$this->db->close();
}
private function __clone(){}
public function connect() {
$this->db = @new MySQLi($this->host, $this->username, $this->password, $this->database);
/* change character set to utf8 */
$this->db->set_charset("utf8");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
return $this->db;
}
}
我的统计课程:
class Statistic {
private $remote, $user_agent, $referer;
private $db;
/**
* Create Instance of MySQL
**/
function __construct($db) {
$this->db = MySQL::getInstance();
}
/**
* Check for counter today
*
* @param: string SQL
* @return: boolean (true = Counter exists, false = Counter doesnt exist)
**/
function checkExistingCounter($sql) {
$stmt = $this->db->prepare($sql);
$this->db->error;
if (!$stmt) {
echo 'Datenbankfehler';
exit;
}
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows) {
$stmt->close();
return true;
} else {
$stmt->close();
return false;
}
}
function counter() {
$sql = "SELECT ID FROM Counter WHERE Datum = CURDATE()";
$checkCounter = $this->checkExistingCounter($sql);
}
这是我的index.php的一部分:
$db = new MySQL();
$statistic = new Statistic($db);
$statistic->counter();
答案 0 :(得分:1)
你似乎陷入困境,实施了两套竞争编码模式:
MySQL
类扩展MySQLi
(即,任何MySQL
对象也是MySQLi
对象)并“委托”到MySQLi
实例在其私有变量$db
Statistic
类在其构造函数中采用MySQL
的实例(“依赖注入”),但随后忽略它并向MySQL
类询问“单例”实例。 / LI>
您需要更仔细地阅读每种模式的用途,并在每种情况下决定一个或另一个(继承或委派,依赖注入或单身人士)。
目前,您的代码将执行以下操作:
MySQL
对象(也是一个MySQLi
对象,但尚未初始化为任何特定的数据库连接,因为您尚未调用parent::__construct()
)MySQL
构造函数中,设置$this->host
等connect()
方法中,创建一个新的MySQLi
对象,将其传递给主机等$this->db
,该对象仅在析构函数中引用($this->db->close()
)MySQLi
返回connect()
个对象,但__construct()
中没有任何内容正在查看该返回值MySQL
对象被传递给Statistic
类的构造函数MySQL::getInstance()
而不是getInstance()
方法(因为这是第一次调用它)将创建第二个MySQL
对象,重复步骤1到5 MySQL
对象将$this->db
对象保存为Statistics
checkExistingCounter
方法尝试将$this->db
用作MySQLi
连接,但MySQL
对象从未连接到任何数据库,因此您收到错误消息。 (有一个连接的连接,如果它不是私有的,你可以像$this->db->db
一样访问它。还有另一个连接,它是在第2步创建的,但你不能再访问它了,因为你在第7步忽略了它。)