2011-01-06 14 views
1

編集:PHP PDOクエリ機能

以下の会話のため、以下の回答が正しいとマークしています。返信されていない部分への返信は自由にしてください。ここで確認してください。ありがとう。

= - = - = - = - = - = - = - = -

私は1つの機能がすべて準備された文を扱う持ってしようとしています。私の古いコードでは、selectクエリを使ってmysql_fetch_assoc-ingしていました。 Insert updateまたはDeleteを実行している場合に、私がselectと多分lastInsertIdまたはaffectedRowsを実行している場合は、配列を返すだけです。

私の質問は、 'select'や 'insert'のためにSQLを解析するのとは別に、$ type = 'Select'のような関数に別のパラメータを追加するのと同じですが、データがあるかどうかを知るPDOクラスには何かありますか?

fetchまたはfetchAllによって返された値がtrueであるかどうかをテストできます。それは私がやるべきことですか?

私はこの機能に関するフィードバックも受け付けています。

function pdo_query($sql,$data) 
{ 
$stmt = $dbh->prepare($sql); 
$first_row = true; 

if(is_array($data)){ 
    foreach($data as $row){ 
     if(is_array($row)){ 
      foreach($row as $param => $value){ 
       if($first_row){ 
        //http://bugs.php.net/43130 parameters can't have dashes 
        $stmt->bindParam($param, ${substr(str_replace('-','_',$param),1)}); 
       } 
       ${substr(str_replace('-','_',$param),1)} = $value; 
      } 
      $stmt->execute(); 
      $first_row = false; 
     } 
    } 
    while ($row = $stmt->fetch()) { 
     $return[] = $row; 
    } 
} 
return $return; 
} 

編集: )(フェッチ>私はまだこれを試していませんが、$ stmnt-のためのあらゆる問題のテストはありますか?また、lastInsertId()や影響を受ける行を自動化したい場合は、その事実の後にどのようなタイプのクエリを実行できるかわかりません。私はここにいる:

if ($rows = $stmt->fetchAll()) { 
     return $rows; 
    } else if (some_way_of_determining_if_an_insert_happened) { 
     return $dbh->lastInsertId(); 
    } else { 
     return some_way_of_returning_affected_rows 
    } 
} 
+0

なぜ手動バインディングが気になるのですか?なぜ($ data)を実行しないのですか? –

+0

うーん...私は知っていると思った。私はバインディングが何をするかを見なければならないでしょう。あなたのご意見ありがとうございます。 – Stephane

+0

私は一度同様のアプローチをとった:http://stackoverflow.com/questions/3725879/fetchall-helper-function-using-pdoしかし、それは配列ではなく、インラインでパラメータをとる。 '$ db-> fetchAll(" SELECT * FROM table WHERE a =?AND b =? "、$ a、$ b)' dunnoの方が良いです。配列型の場合はパラメータをテストし、その結果の配列に項目を追加する必要があります –

答えて

2

あまりにもスマートに感じることはありません。

一連の方法を作成します。

  • 一般的には、queryと呼ばれ、リソースタイプを返します。
  • このクエリメソッドを使用すると、スカラー値、行、列、および一連の行が返されます。
  • 与えられたリソースから影響を受けた行数、返された行数、挿入されたIDなどを取得するユーティリティメソッド。

また、SETステートメントを生成する方法は、挿入メソッドと更新メソッドで使用すると便利です。彼らは、パラメータとしてリンク識別子を取るよう識別子をリソースではない、

//SELECT helpers: 
$username = $db->getOne("SELECT name FROM users WHERE id=?",$id); //getting scalar 
$userinfo = $db->getRow("SELECT * FROM users WHERE id=?",$id); //getting row 
$newsdata = $db->getAll("SELECT * FROM news LIMIT ?,?",$start,$rows); //getting array 

//Select for mass emailing 
$res = $db->query("SELECT * FROM notify WHERE topic_id = ?",$topic); 
$num = $db->numRows($res); 
while ($row = $db->next()){ 
    mail(...); 
} 

//insert 
$res = $db->query("INSERT INTO users SET name = ?",$name); 
$id = $db->lastId(); 

//delete 
$res = $db->query("DELETE FROM users WHERE id = ?",$id); 
$rows = $db->affectedRows(); 

は、しかし、私は(affectedRowsについて確認していない)とlastId方法....

:例えば this one

の例を参照してください。

+0

私はあなたの要点を理解しており、関数とメソッドの作成方法をどのように変更したのでしょうか?ありがとうございました。 – Stephane