我正在想办法用我的类来扩展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();
}