扩展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;

其次,您必须像其他人说的那样调用父级的构造函数,否则它将无法运行。

但作为一个附带说明,我建议您不要将db类扩展为login。到目前为止,我发现的最好的方法是有一个数据库访问类,作为应用程序的单例实例化。这样,任何需要它的类都会请求一个singleton实例并使用它

优点是显而易见的:所有数据库访问都将通过一个实例进行,这使您的应用程序更加高效,因为所有操作都将通过单个数据库连接完成。按照您的做法,一旦构建了登录实例,就会建立一个新的数据库连接。

如果您继续将db类扩展到其他类,如用户、产品等,则会创建新的数据库连接,从而浪费服务器上的资源。

应该删除构造函数重载,或者在构造函数方法中调用parent::__construct。如果没有它,父级的构造函数就不会被激发。

class login extends db {
    public function __construct(){
        parent::__construct();
    }