2013-12-18 11 views
13

私は自分のデータにdatabasewrapperを使用することに関するいくつかの研究を行ってきました。 しかし、私は、すでに1つであるため、データバスラッパーにPDOを使用すべきではないと人々が主張している記事を読んでいます。pdoラッパーは本当に過剰ですか?

そうかもしれませんが、私はまだそれが多くの利点を持っていると確信しています。

  1. すべてのデータアクション(クラッド)は、1つのクラスで処理され、Webサイトファイルには分散されません。したがって、エラーをデバッグして処理する方がはるかに簡単です。
  2. 別のデータバークラスを使用してクラスを簡単に変更できます。

    :あなただけのオプションでは、例えば、ロギング、統計テスト、...

例えば持つクラスを拡張することができます

  • databaseclassにコードを呼び出す、あなたのコードを繰り返す必要はありません
  • <?php 
    class Database 
    { 
        public $connection; 
        private $host = ""; 
        private $username = ""; 
        private $password = ""; 
        private $dbname = ""; 
    
        public function __construct(){  
         $this->connection = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username,$this->password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
         $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
        } 
    
        public function insert($query, array $data){   
         $this->connection->prepare($query)->execute($data);  
         return $this->connection->lastInsertId(); 
        } 
    
        public function update($query, array $data) { 
         $stmt = $this->executeQuery($query,$data); 
         return $stmt->rowCount();  
        } 
    
        public function delete($query, array $data) { 
         $stmt = $this->executeQuery($query,$data); 
         return $stmt->rowCount();  
        } 
    
        public function findOne($query, array $data = null){   
         $stmt = $this->executeQuery($query,$data);   
         return $stmt->fetchObject(); 
        } 
    
        public function findMany($query, array $data = null){ 
         $stmt = $this->executeQuery($query,$data); 
         return($stmt->fetchAll(PDO::FETCH_OBJ)); 
        } 
    
        public function executeQuery($query,$data = null){ 
         $stmt = $this->connection->prepare($query); 
         $stmt->execute($data); 
         return $stmt; 
        } 
    } 
    ?> 
    

    データを取得するためのすべての手順を常に繰り返す代わりに、get()を呼び出してクエリといくつかのオプションのパラメータを渡すことができます。 毎回接続を開くよりもずっと効率的です.3行のコードを実行して閉じてください。

    $db->get("select * from user where id = ?",array(1)); 
    
  • +0

    「すべてのステップ...」 - 本当に多くのことがありますか? PDOでは 'foreach($ pdo-> query(...)$ row)'と書くことができます。これは準備ができていない文の場合とほとんど同じです。データベースとのやりとりは高価で、「場所を選ばず」ではなく、非常に特定の方法でしか始まらないはずです。なぜなら、なぜそれが常に1行で起こらなければならないのか分かりません。 – deceze

    +0

    場所のいたるところではなく、非常に特定の方法ではどういう意味ですか? –

    +0

    MVC、懸念事項の分離。モデルレイヤーには、データベースからデータを取得する場所がいくつかあります。例えば。 'UserService :: getAllActiveUsers()'または 'PostService :: updatePost($ id、array $ data)'を呼び出します。これらの方法の唯一の仕事は、特定の方法でデータベースと対話することです。内部では、必要に応じて適切なデータベースクエリに多くの行を費やす必要があります。単一の行にする利点はありません。このような「シンプルなラッパー」を使用すると、一度これらの中心的なメソッドを作成するのではなく、その場でアドホックからデータベースをクエリすることを誘惑するだけです。 – deceze

    答えて

    6

    PDOラッパーを作成する最も試みは確かに無力であり、生PDOよりもさらに悪いことので、それは言われています。
    また、前提は、そのラッパーをベースに書かれていますが、ほとんど間違っています。

    のは、あなたを見てみましょう:

    あなたは一つのクラスにすべてのデータを処理し、あなたのウェブサイトのファイルに広がっていません。

    明確な意味はありません。確かに、アプリケーション全体でデータを処理しますが、raw PDOではなく独自のクラスを使用してデータを処理します。

    別のデータバークラスを使用してクラスを簡単に変更できます。

    しかし、妄想です。あなたは実際には2つのヘルパーメソッドに固執することはできません - 時々あなたは生のPDOインスタンスを使用する必要があります。

    あなたはこの1つは非常に本当です

    databaseclassにコードを呼び出す、あなたのコードを繰り返す必要はありません。しかし、他のAPIと同様に有用ではありません。異議 -

    オプションで、例えば、ロギングのためにクラスを拡張することができ、統計は、これは適切なものである

    をテストします。

    これは、接続を開くたびに効率がよく、3行のコードを実行して閉じます。

    これは誤ったものです。 誰もいませんは毎回接続を開き、3行のコードを実行して閉じます。 raw PDO接続であっても、接続は1回だけ開かれます。

    しかし、あなたの実装はかなり良いです。それは生のPSOにあまりにも多くを追加しません(実際には1つの行だけで繰り返しを短縮します)が、まだ分かりやすいです。だから、私はこのアプローチをかなり成功と呼んでいます。

    ヒント:

    1. クラスのプロパティとして、データベースの認証情報を保存するにはポイントは確かにありません。コンストラクタで必要なのはコンストラクタのみで、それ以外のところは必要ありません
    2. 余分な方法を必要とせずにコンストラクタで接続を作成しないのはなぜですか?
    3. public function getOne()は、あなたのセットに不可欠です。
    4. あなたは$接続を公開する必要が
    5. - あなたは両方のPDOから利用可能なすべてのメソッドを作る少なくともまでとはPDOStatement
    +0

    私の最初の声明では、私はすべてのデータベース操作を扱うことを意味しました。それは確かにかなり曖昧でした。私はしばしば、人々がページ全体で絶え間なく操作を使用して自分のWebページを構築するのを見ます。代わりに、ベスト・プラクティスは、1つのクラスがすべてのデータベース操作を処理できるようにすることだと確信しています。 –

    +1

    まあPDOはすでにそのようなクラスのふりをしています。 PDOについて言えば、あなたの主張はそれほど重要ではありません。ラッパーの主な問題は、書いている人がPDOクリエイターよりも知識が少なく、物事を悪化させることです。 execute()だけがbooleanの代わりに$ thisを返した場合、あなたのクラスは本当に時代遅れになります。 –

    +1

    確かに、私はPDOクリエイターよりも優れているとは限りません:)。私はそれを改善しようとはしていませんが、オブジェクトを返すメソッドを作成することで簡単に使用できます。 –

    2

    「オーバーキル」は主観的です。あなたの特定のケースを決定するためのあなたのためのもの。パフォーマンスに賢明な違いがあることに気付くはずです。

    このようなことを行うと、いくつかのメリットがあります。たとえば、クエリプロファイリングとアプリケーションログをクラスに埋め込むことができます。そして、あなたが指摘しているように、あなたが作業して維持するのが最も簡単な方法でクエリを構造化するオプションがあります。

    一方、ラッパークラスに依存している場合、コードの移植性が低下します。そのコードを取り、PDOに依存するコードで使用することはできません。 PDOクラスのラッパーを作成するのではなく、PDOクラスを拡張することによって、これらの制限のいくつかを回避できます。

    関連する問題