2

私はOOPを学ぼうとしていて、PDOを使用するクラスを作成することにしました。ここに私のクラスからのいくつかのコードがあります。

class DB extends PDO {

public function _construct($dsn,$user,$pass,$options=""){
        $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
        try {
              parent::__construct($dsn, $user,$pass,$options);
              $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        }
         catch(PDOException $e)
         {
              echo $e->getMessage();
         }
}


    public function run($query,$all="",$secure=""){
    if(empty($secure)){
        $qry=$this->query($query);
    }else{
        $qry=$this->prepare($query);
        $qry->execute($this->cleanup($secure));
    }
    if($all=="all"){
         return $qry->fetchAll(PDO::FETCH_ASSOC);
    }else{
         return $qry->fetch(PDO::FETCH_ASSOC);
    }
}



private function cleanup($secure) {
    if(!is_array($secure)) {
        if(!empty($secure))
            $secure = array($secure);
        else
            $secure = array();
    }
    return $secure;
}

public function rowCount($table,$extra=""){
    $query="Select count(*) from ".$table;
    if(!empty($extra)){
        $query="Select count(*) from ".$table." ".$extra;
    }
    $qry=$this->query($query)->fetchColumn();
    return $qry;
}

public function select($table,$extra=""){
    $query="Select * from ".$table;
    if(!empty($extra)){
        $query="Select * from ".$table." ".$extra;
    }
    return  $this->query($query);
}


}

次のコードの違いは何ですか?同じ結果が得られないのはなぜですか?

//usage 1 (it doesnt work that way)
$return =$qry->fetchAll(PDO::FETCH_ASSOC);

return $return;

//usage 2 (it is exactly what i need but i want to learn the difference)
return $qry->fetchAll(PDO::FETCH_ASSOC);

編集:私は本当に私が間違っていたことを知りませんが、これらの使用法の間に違いはないようです。両方とも現在機能しています。

これが私の方法の使い方です

$result=$db->run("my query","all");
foreach($result as $r){
    //
}

構築メソッドでは、PDOのクエリメソッドを使用して文字をutf-8に設定しますが、機能しません。DBオブジェクトを作成した後に使用すると、機能します。

try {
    parent::__construct($dsn, $user,$pass,$options);
    $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $this->query("SET NAMES 'UTF8'");
            $this->query("SET CHARACTER SET UTF8");
}

最後の質問

            //what do u think about this usage.I didnt run accross some thing like this
            //all the pdo classes i checked use it just 
            // return $qry->fetchAll(PDO::FETCH_ASSOC);
            //do you think i need to separate "fetchAll"  and "fetch"
            if($all=="all"){
         return $qry->fetchAll(PDO::FETCH_ASSOC);
    }else{
         return $qry->fetch(PDO::FETCH_ASSOC);
    }
4

2 に答える 2

2

PDOを拡張しないでください。多くの点で間違っています。代わりに、タイトルが示すように使用する必要があります

class Database
{
     protected $pdoInstance;

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

     public function query($query)
     {
         $preparedStatement = $this->pdoInstance->prepare();
         /* bla bla bla */
     }
}

このコードははるかに理にかなっており、優れたオブジェクト指向プログラミングのはるかに優れた例です。(それでも私はうんざりしますが、それは良いスタートです)

于 2013-03-06T14:25:56.780 に答える
1

まず第一に、そのような良い質問はここではめったに見られません。
PDOでの抽象化クラスの必要性を理解している人はほとんどいません。

だから、ここにいくつかの提案があります。

  1. run単一の機能にしないでください。結果タイプごとに別々のメソッドを使用する方がはるかに便利です。比較

    $data = $db->getAll($sql);
    $data = $db->run($sql,"all");
    
    $data = $db->getOne($sql);
    $data = $db->run($sql,"one");
    
    $data = $db->getCol($sql);
    $data = $db->run($sql,"col");
    
  2. 関数名を考える必要があります。「クリーンアップ」機能はクリーンアップを行いません。
    代わりにfunc_get_args()を使用します。

  3. 次のコードの違いは何ですか?同じ結果が得られないのはなぜですか?

    違いはありません

    $return = $qry->fetchAll(PDO::FETCH_ASSOC);
    return $return;
    

    動作するはずです。「機能しない」と定義します。

  4. 構築メソッドでは、PDOのクエリメソッドを使用して文字をutf-8に設定しますが、機能しません。

    DSNで文字セットを設定する必要がありますが、これも機能するはずです。「機能しない」を定義する

  5. また、コンストラクターでDSNを作成して、構成ファイルをより使いやすくすることをお勧めします。また、私のmysqlヘルパークラスからいくつかのアイデアを入手したいと思うかもしれません。プリペアドステートメントとは異なるアプローチを使用していますが、PDOよりもはるかに安全です。

于 2013-03-06T13:40:44.073 に答える