我想知道如何用我的课程扩展mysqli。
这是我的db类;
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();
}
}
我希望在此登录类中扩展此db类:
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
答案 0 :(得分:3)
如果覆盖__construct
,原始构造函数将无法运行,也不会创建连接。
答案 1 :(得分:2)
从db扩展登录没有意义 而不是扩展您必须使用数据库类作为登录类中的服务。
class login{
public function __construct($db){
$this->db = $db;
}
public function check_login($email, $password) {
$stmt = $this->db->prepare("SELECT * FROM accounts WHERE email = ?");
...
}
}
另请注意,运行查询的方式是错误的。你必须使用准备好的陈述
答案 2 :(得分:1)
首先,您使用$this->mysqli
,但$mysqli
类中没有属性db
。将其声明为protected
,因为扩展类需要访问它:
protected $mysqli;
其次,你必须像其他人所说的那样打电话给父母的构造函数,否则它就不会运行。
但是作为旁注,我建议你不要将db
类扩展为login
。我到目前为止找到的最好的方法是拥有一个db访问类,实例化为你的应用程序的单例。这样,任何需要它的类都会要求单例实例并使用它。
优势显而易见:所有数据库访问都将通过单个实例进行,使您的应用程序更加高效,因为所有内容都将通过单个数据库连接完成。你正在做的方式,一旦你构建一个登录实例,就会建立一个新的数据库连接。
如果继续将db
类扩展到其他类(如用户,产品等),则会创建新的数据库连接,从而浪费服务器上的资源。
答案 3 :(得分:0)
您应该删除构造函数重载,或者在构造函数方法中,您应该调用parent::__construct
。没有它,父的构造函数不会被触发。
class login extends db {
public function __construct(){
parent::__construct();
}