1

私はPDOとOOPの両方にかなり慣れていません。データベースに接続し、挿入を更新して変更するクラスを作成しようとしています。いくつか質問があります:

  1. コンストラクターでデータベースに接続するのは良い習慣ですか?

  2. 1 つのクラスで更新、挿入、変更、および接続を行うべきか、それとも複数のクラスに分割するべきか?

  3. runQuery が機能しないのはなぜですか? $pdo が別のスコープで定義されているためだと思います。どうすればこれを機能させることができますか?

  4. クラスがすべてのページの上部に含まれている場合、新しいページが読み込まれるたびにデータベースに再接続され、セキュリティの問題が発生することを意味しますか?

質問の過負荷についてお詫び申し上げます。ご回答ありがとうございます。

<?php
class Login{

private $_username;
private $_password;
private $_host;
private $_database;
private $_driver;

//Connect to the database

function __construct($configFile){

    $connectionDetails = parse_ini_file($configFile);

    $this->_username = $connectionDetails['username'];
    $this->_password = $connectionDetails['password'];
    $this->_host = $connectionDetails['host'];
    $this->_database = $connectionDetails['database'];
    $this->_driver = $connectionDetails['driver'];

    $pdo = new PDO("$this->_driver:host=$this->_host;dbname=$this->_database", $this->_username, $this->_password);

}

public function loginAllowed($user, $pw){

    $sth = $pdo->setFetchMode(PDO::FETCH_ASSOC);
    print_r($sth);
}

public function runQuery($query, $params){
    $sth = $this->pdo->prepare($query);
    $sth->execute($params); 
}
}
4

4 に答える 4

7

$pdoコンストラクターとメソッドのローカル変数であるためですloginAllowedprivate $pdoを通じて呼び出すことができるように、インスタンス変数 ( ) にする必要があります$this->pdo。また、ここで型ヒントPDOを使用して、クラスをコンストラクターのパラメーターとして指定することもお勧めします。

<?php
class Login {
    private $pdo;
    // Your other instance variables

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    // Your other methods
}

$pdo = new PDO("...");
$login = new Login($pdo);

設定の読み取りとデータベース接続の初期化でクラスを煩わせる必要はありません(懸念の分離について必ず読んでください)。クラスから遠ざけてください。PDO オブジェクトをパラメーターとして指定するだけです (型ヒントを使用したため、その型のオブジェクトを提供する必要がありますPDO)。もう1つの利点は、アクティブなデータベース接続が1つだけであることを確認できることです(コードベースでこれを管理できます)。複数の接続を作成することは不要であり、明らかに望ましくありません(パフォーマンスの観点から)。

また、require_onceを使用してクラス定義を含めます。そうしないと、再宣言に関する多くのエラーが発生します (これは避けたいと思います)。

于 2012-05-02T06:45:37.557 に答える
1
  1. 最も便利な場所でデータベースに接続します。接続が 1 つだけであることを確認してください。同じデータベースへのより多くの接続は、時間とリソースの無駄です。

  2. 参照するクラスは、MVC アーキテクチャではモデルと呼ばれます。通常、特定のテーブルに対するすべての操作を実行します。コードが読み取り可能で保守可能である限り、すべてのニーズに対して単一のクラスを使用することに問題はないと思います。

  3. $pdoはローカル変数であるため、機能していません。ctor では、$this->pdo代わりにインスタンス化します。

  4. クラスをインクルードすることは、それをインスタンス化することと同じではありません。新しいインスタンスは別の接続を確立します。複数回含めると、複数の宣言エラーが発生するだけです:)。require_once代わりに使用してください。インスタンスを複数のファイルで使用する場合は、Singleton パターンに関するクイック検索を行うことを強くお勧めします。シングルトン オブジェクトを使用すると、モデル オブジェクトのインスタンスが常に 1 つだけになります。

于 2012-05-02T06:52:39.167 に答える
1

すべてのランダムなものを気にする必要はありません。コンストラクトでこれを置き換えるだけです。

$pdo = new PDO("$this->_driver:host=$this->_host;dbname=$this->_database", $this->_username, $this->_password);

$this->pdo = new PDO("$this->_driver:host=$this->_host;dbname=$this->_database", $this->_username, $this->_password);

今後は $this->pdo として参照します。それと同じくらい簡単です!!

于 2012-07-14T06:00:51.400 に答える
0

1)コンストラクターでデータベースに接続するのは良い習慣ですか?

ダメです。クエリの前に接続するだけです

if($this->pdo == null) {
$this->pdo = new PDO("....");

}

2) 1 つのクラスで更新、挿入、変更、接続を行うべきか、それとも複数のクラスに分割するべきか? クラスのメソッドを追加

3) runQuery が機能しないのはなぜですか? $pdo が別のスコープで定義されているためだと思います。どうすればこれを機能させることができますか?代わりに $this->pdo を使用してください

4) クラスがすべてのページの上部に含まれている場合、新しいページが読み込まれるたびにデータベースに再接続され、セキュリティの問題が発生することを意味しますか? static $pdo を使用すると、 self::$pdo が唯一のコネクタになります

if(self::$pdo == null) {
self::$pdo = new PDO("....");

}

于 2012-05-02T07:13:16.770 に答える