-1

クラスで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

4 に答える 4

3

をオーバーライド__constructすると、元のコンストラクターは実行されず、接続が作成されません。

于 2013-07-09T17:36:48.360 に答える
2

login を 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 アクセス クラスを持つことです。このようにして、それを必要とするクラスはシングルトンインスタンスを要求して使用します。

利点は明らかです。すべてのデータベース アクセスが 1 つのインスタンスを介して発生し、アプリケーションがはるかに効率的になります。これは、すべてが 1 つのデータベース接続を介して行われるためです。このように、ログイン インスタンスを作成するとすぐに、新しいデータベース接続が確立されます。

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 に答える