簡體   English   中英

擴展MySQLi給我錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM