-1

PDO を使用して mysql クエリのすべての処理を行う DB (class.pdo.php) というクラスと、ログイン システムの管理に使用する user という別のクラスがあります。

私の質問は、DB を使用できるように、ユーザーのすべてのパブリック関数で常に $db をインスタンス化する必要があることに関連しています。これは効率的ですか?ユーザーの __construct() 内で DB をインスタンス化するべきではありませんか?

これは私のコードです

 require_once("../../class.pdo.php");

class user {

private $db = null;

public function __construct(){
    /* Empty? */
}

public function find_by_email($email){
    $db = new db();
    $db->query('SELECT * FROM users WHERE email = :email LIMIT 1');
    $db->bind(':email',$email);
    $result = $db->single();
    return $result;
}

public function create($email,$password,$first_name,$last_name){ 
    $db = new db();
    $db->query("INSERT INTO users(email,password,first_name,last_name,created_at) VALUES (:email,:password,:first_name,:last_name,NOW())");
    $db->bind(':email',$email);
    $db->bind(':password',$password);
    $db->bind(':first_name',$first_name);
    $db->bind(':last_name',$last_name);
    $result = $db->execute();
    return $db->lastInsertId();
}

 [more similar functions ommited]
4

5 に答える 5

2

常に新しいオブジェクトを作成するのではなく、Singleton パターンを使用して接続用の 1 つのオブジェクトを作成し、必要なときにそれを使用するのはどうでしょうか?

于 2013-05-22T11:17:48.280 に答える
1

効率といえば、コードの主な問題は、呼び出されるすべてのメソッドに対して新しい接続を確立することです。これは実際、データベース サーバーを停止させるほど非効率的です。そして、それはあなたが抱えている他の問題とは比べものになりません。

したがって、一般的には、あらゆる関数で db クラスのインスタンスを何らかの方法で取得するか、クラス変数を使用するなど、どのような方法でも使用できますが、どちらの方法でも、アプリケーション全体で単一の PDO インスタンスを使用する必要があります。

また、あなたの関数はコード量の観点から非常に非効率的であり、この方法で最適化したでしょう

public function create($email,$password,$first_name,$last_name){ 
    $sql = "INSERT INTO users(email,password,first_name,last_name,created_at) VALUES (?,?,?,?,NOW())";
    $this->db->query($sql);
    $result = $db->execute(func_get_args());
    return $db->lastInsertId();
}
于 2013-05-22T11:33:47.060 に答える
0

オブジェクトの観点からは、クラス全体ではなく、データベースのインスタンス化をメソッド内に残します。

各メソッドは、その機能を実行するために必要な変数とデータのみを参照する必要があります。たとえば、メソッドは、、、などのcreateUser()変数またはプロパティを参照する必要があります。$username$usergroupId$database

randomPassword()ただし、数字と文字からランダムなパスワードを生成すると呼ばれる関数がある場合があります。

この randomPassword() 関数はデータベース オブジェクトを必要としないため、オブジェクト スコープで既に初期化されているデータベース接続は無駄になります。

新しいデータベース オブジェクトは、必要なメソッドでのみ作成することをお勧めします。

さらに、私のアプリケーションでは、 を使用するたびに新しいデータベース接続を作成しませんnew database。代わりに、接続をアクティブに保つシングルトン PDO データベース オブジェクトを選択しました。

その後、データベース オブジェクトを静的に呼び出して、既存の接続を取得できます。したがって、アプリケーションの実行中に 20 個のデータベース オブジェクトが必要な場合、アプリケーションは同じオブジェクトと同じ接続のみを返します。

于 2013-05-22T11:15:11.063 に答える