扩展MySQLi给我错误

时间:2013-07-09 17:34:18

标签: php mysqli

我想知道如何用我的课程扩展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

4 个答案:

答案 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();
    }