-1

我想弄清楚如何用我的类扩展 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
4

4 回答 4

3

如果您覆盖__construct,原始构造函数将不会运行并且不会创建连接。

于 2013-07-09T17:36:48.360 回答
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 = ?");
         ...
    }
}

另请注意,您运行查询的方式是错误的。您必须使用准备好的语句

于 2013-07-09T17:42:58.187 回答
1

首先,您使用,但类中$this->mysqli没有属性。将其声明为,因为扩展类需要访问它:$mysqlidbprotected

protected $mysqli;

其次,你必须像其他人所说的那样调用父级的构造函数,否则它不会运行。

但作为旁注,我建议您不要将db类扩展为login. 到目前为止,我发现的最佳方法是创建一个 db 访问类,将其实例化为您的应用程序的单例。这样,任何需要它的类都会请求一个单例实例并使用它。

优势很明显:您的所有数据库访问都将通过单个实例进行,从而使您的应用程序更加高效,因为一切都将通过单个数据库连接完成。您正在做的方式,一旦您构造了一个登录实例,就会建立一个新的数据库连接。

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

于 2013-07-09T17:41:39.700 回答
0

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

class login extends db {
    public function __construct(){
        parent::__construct();
    }
于 2013-07-09T17:37:49.630 回答