[英]Extending MySQLi giving me error
我試圖弄清楚如何用類擴展mysqli。
這是我的數據庫類;
class db {
protected $_server = "localhost";
protected $_user = "root";
protected $_pwd = "";
protected $_db = "test";
protected $_charset = "utf8";
function __construct(){
$this->createConnection();
}
private function createConnection(){
$this->mysqli = new mysqli($this->_server, $this->_user, $this->_pwd, $this->_db);
$this->mysqli->query("SET NAMES ".$this->_charset);
$this->mysqli->query("SET CHARACTER SET ".$this->_charset);
if($this->mysqli->connect_error) {
//die('Error ('.$this->mysqli->connect_errno.') '.$this->mysqli->connect_error());
die();
}
//$this->mysqli->close();
}
public function mysqli_fetch_object($query){
$query = $this->mysqli->query($query);
return $query->fetch_object();
}
}
我想在此登錄類中擴展此數據庫類:
require_once("dbClass.php");
class login extends db {
public function __construct(){
}
public function check_login($email, $password) {
$email = $this->mysqli->real_escape_string($email);
$validateMail = filter_var($email, FILTER_VALIDATE_EMAIL);
$password = $password;
$database_check = $this->mysqli_fetch_object("SELECT * FROM accounts WHERE email = '$validateMail'");
}
}
我得到這些:
Notice: Undefined property: login::$mysqli
Fatal error: Call to a member function real_escape_string() on a non-object
如果覆蓋__construct
,則原始構造函數將不會運行,也不會創建連接。
從數據庫擴展登錄沒有任何意義。
不必擴展,而必須將數據庫類用作登錄類中的服務。
class login{
public function __construct($db){
$this->db = $db;
}
public function check_login($email, $password) {
$stmt = $this->db->prepare("SELECT * FROM accounts WHERE email = ?");
...
}
}
還要注意,您運行查詢的方式是錯誤的。 您必須使用准備好的語句
首先,使用$this->mysqli
,但db
類中沒有屬性$mysqli
。 將其聲明為protected
,因為擴展類將需要對其進行訪問:
protected $mysqli;
其次,您必須像其他人所說的那樣調用parent的構造函數,否則它將無法運行。
但是,請注意,我建議您不要將db
類擴展為login
。 到目前為止,我發現的最佳方法是擁有一個數據庫訪問類,該類被實例化為應用程序的單例。 這樣,任何需要它的類都會要求一個單例實例並使用它。
優點是顯而易見的:您所有的數據庫訪問都將通過單個實例進行,從而使您的應用程序更加高效,因為所有事情都將通過單個數據庫連接完成。 您的操作方式是,一旦構建登錄實例,就會建立一個新的數據庫連接。
如果您繼續將db
類擴展到其他類,例如用戶,產品等,則將創建新的db連接,從而浪費服務器上的資源。
您應該刪除構造函數重載,或者在構造函數方法中,應調用parent::__construct
。 沒有它,就不會觸發父級的構造函數。
class login extends db {
public function __construct(){
parent::__construct();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.