2012-02-28 8 views
2

これは私が実現したいことです。 私はそれが好きなので、PDO、joustを使いたいですが、PDOの上にいくつかの新しいメソッドを追加したいと思います。PHP - PHPのデータオブジェクトを拡張して新しい機能を追加する

同様:更新()、()を挿入、(削除)、fetchAllAssoc()、等...

だから私は、PDOと一つのクラス内からPDOのStatementオブジェクトの両方で動作する必要があります。 更新を達成するためには、私はクエリを作成し、準備しておく必要があります。それはPDO Statementオブジェクトを返し、bindValuesを実行してから実行する必要があります。

これは私がこれまでにやっていることである:、私の質問がある

use Database\DBAL\Database; 
$db = Database::getInstance(); 
$db->update("users", array("user_password" => "new password"), array("user_id" => 1)); 

これはそれを行うための正しい方法です:あなたはこのようにそれを使用することになり

<?php 

    namespace Database\DBAL; 
    use PDO; 

    class Database extends PDO 
    {    
     protected static $instance; 

     public static function getInstance() 
     { 
      if(empty(static::$instance)) 
      { 
       // This will be fetched from config 
       $dns = "mysql:host=localhost;dbname=db_name";    
       $username = "root"; 
       $password = "my_pwd"; 
       static::$instance = new Database($dns, $username, $password); 

      } 
      return static::$instance; 
     } 

     /** 
     * Detect param type 
     */ 

     protected function detectType($value) 
     { 
      if(is_string($value)) 
      { 
       return PDO::PARAM_STR; 
      } 
      else if(is_int($value)) 
      { 
       return PDO::PARAM_INT; 
      }        
      else if(is_null($value)) 
      { 
       return PDO::PARAM_NULL; 
      } 
      else if(is_bool($value)) 
      { 
       return PDO::PARAM_BOOL; 
      } 
      else 
      { 
       return false;  
      } 
     }   

     /** 
     * Updates table 
     */ 

     public function update($table, $data, $identifier) 
     { 

      $set = array(); 

      foreach ($data as $columnName => $columnValue) { 
       $set[] = $columnName . ' = ?'; 
      } 

      $query = 'UPDATE ' . $table . ' SET ' . implode(', ', $set) . ' WHERE ' . implode(' = ? AND ', array_keys($identifier)) . ' = ?'; 
      $params = array_merge(array_values($data), array_values($identifier)); 

      array_unshift($params, null); 
      unset($params[0]); 

      echo $query; 

      $pdos = static::$instance->prepare($query); 

      foreach($params as $key => $param) 
      { 
       $pdos->bindValue($key, $param, $this->detectType($param)); 
      } 

      return $pdos->execute(); 

     } 

    } 

?> 

? 私はデコレータとファサードのパターンについて読んでいました。 単純な削除、挿入、データのフェッチを行う方法でPDOクラスを拡張する最善の方法は何ですか?そして、私はPDOが無傷であることを願っています。私はいつもそうするように使用することができます。私はどのようなパターンを使用すべきでしょうか、何が最良の方法でしょうか?

ありがとうございます!

+1

ormのようなdoctrineで作業することを検討していますか? –

+0

まあまあ、私はDoctrine DBALを使いました。私はそれが好きですが、DBAL APIが行く限り良くなると思います。 ORM、joust DBALは必要ありませんが、より多くのメソッドが必要になりますので、データを取得するのが簡単になり、SQLインジェクションから保護されたものがすべて必要です。それはDoctrine DBALの場合とは異なります。だから私はDoctrine DBALに似たものを作りたいと思っていますが、いくつかの機能を追加したより簡単なjoust PDOです。必要なのはどのパターンを使うべきか、PDOを拡張する最良の方法を見つけることだけです。 – Limeni

答えて

0

私が正しいのであれば、あなたは反パターンであるアクティブな記録パターンを実装しています。いくつかのORMフレームワークを見てください。 私は自分自身を作成し​​ました:すべてのPDOのstuffess(私はPDOを拡張していません!)、すべてのCRUD操作を扱うTableEntityクラスと "テーブルの行"であるEntityクラスを独自に作成しました。

$dc = new TestDataContext(...); 
$dc->users()->Where(column, 1, '=')->... 
$dc->users()->InsertOnSubmit(new User()) 
$dc->SubmitChanges(); 

Linq to SQLに似ています。 :-)

関連する問題