2010-12-27 13 views
3

私の履歴スクリプトをmysql_query()からPDOに変換する方法を解明しようとしています。私はあなたがランダムに選択できる4つの入力フィールドを持つフォームを持っています。つまり、取得しようとしている情報に応じて、0,1,2,3,4フィールドが選択できます。PHP PDOによる動的クエリ

私はこのようなDBを照会しようとしました:

$q = $db->prepare('SELECT date, 
          name, 
          action 
        FROM history 
        WHERE name = :name 
        AND action = :action'); 

$q->bindParam(':name', $Name, PDO::PARAM_STR, 20); 
$q->bindParam(':action', $Action, $PDO::PARAM_STR, 20); 
$q->execute(); 

しかし、私が選択した任意のフィールドを持っており、全体の歴史が示されたくない場合は、これは動作しません。するmysql_queryで

()私はこれを行うだろう。そこには$名ませんか$がアクション彼らは単にクエリに含まれていない場合を意味

mysql_query('SELECT date, 
        name, 
        action 
      FROM history 
      $Name 
      $Action'); 

古いクエリを$ q = $ db-query( '')にコピー/ペーストすればよいですか?しかし、その種のPDOを使用する目的を破る。

答えて

10

カラム名に準拠するパラメータには常にデフォルト値を割り当てることができます。

このように、デフォルトのケースではクエリはwhere column = columnとなり、値が存在する場合はwhere column = valueとなります。

EDIT:

もちろんbindParamがそのように動作していないので、私のロジックは、少し欠陥でした。その代わりに、パラメータセットに従って文を段階的に構築する必要があります。この例では

/* Start with the most general case for the sql query. 
* The where part always evaluates to true and will thus 
* always return all rows and exists only to make appending 
* further conditions easier. 
*/ 

$q = 'SELECT date, name, action FROM history WHERE 1'; 

/* Prepare a params array in any way you wish. A loop might be more 
* efficient if it is possible, but since in this example you have 
* only 2 variables, it didn't seem necessary 
*/ 

$params = array(); 
if (! empty($Name)) { 
    $params['name'] = $Name; 
} 

if (! empty($Action)) { 
    $params['action'] = $Action; 
} 

/* When the params array is populated, complete the sql statement by 
* appending the param names joined with ANDs 
*/ 

foreach ($params as $key => $value) { 
    $q .= sprintf(' AND `%s` = :%s', $key, $key); 
} 

/* When the query is complete, we can prepare it */ 
$stmt = $db->prepare($q); 

/* Then bind the values to the prepared statement 
*/ 

foreach ($params as $key => $value) { 
    // Using bindValue because bindParam binds a reference, which is 
    // only evaluated at the point of execute 
    $stmt->bindValue(':'.$key, $value); 
} 

/* Now we're ready to execute */ 
$stmt->execute(); 

emptyチェックは、我々は、SQL文を完成ループ内で行われていたかもしれないが、それはあなたにあまり一般的な例を与えてくれたでしょう。

この例でも、タイプパラメータparamはbindValueですが、これは簡単に実装できます。配列値をメンバとしての型を持つオブジェクトまたは配列に変更することによって、または割り当てループの中でダックタイピングによって変更できます。

このような形式のクエリービルドは、データベースのクエリに必要なすべての機能を、初期の(一般的なケースの)クエリーとparams配列とともに提供する機能に入れることができます。

+0

変数が空の場合は、スペースを追加してみました。うまくいきませんでした。 –

+0

スペースは値であるため、その値を含む列とのみ一致しますが、列は常にそれ自体と一致します。 –

+0

私はあなたのソリューションをphpmyadminで試してみました。今は唯一の問題は、私がbindParamを使用したときに列になるのではなく、検索語に囲まれているということです。任意のアイデアをどのようにそれらを削除するには?私はそれをバインドするときにPDO :: PARAM_STRを使用しています。 –

関連する問題