2012-06-27 14 views
5

ユーザー指定のパラメータで検索を実行するために、パラメータ化されたクエリを実行します。かなりの数のパラメータがあり、それらのすべてが常に供給されるわけではありません。可能なすべてのパラメータを指定する標準クエリを作成するにはどうすればよいですか?ユーザが意味のあるパラメータ値を選択しなかった場合は、これらのパラメータのいくつかを無視しますか?提供されたパラメータの数が予想されるパラメータの数と一致しないため、特定のWHERE条件を無視する

は、ここで私は明らかに

$sql = 'SELECT * FROM people WHERE first_name = :first_name AND last_name = :last_name AND age = :age AND sex = :sex'; 
$query = $db->prepare($sql); 
$query->execute(array(':first_name' => 'John', ':age' => '27'); 

のために行くよ何説明する架空の例ですが、これは動作しません。指定されたパラメータだけがWHERE句に含まれているたびにクエリを作成する必要がありますか、またはこれらのパラメータの一部を無視するか、またはチェックしたときに常にtrueを返す方法がありますか?

答えて

7
SELECT * FROM people 
WHERE (first_name = :first_name or :first_name is null) 
AND (last_name = :last_name or :last_name is null) 
AND (age = :age or :age is null) 
AND (sex = :sex or :sex is null) 

パラメータを渡す場合は、不要なものに対してnullを入力します。あなたのクエリを変更することで、あなたの問題を解決できない場合は、このようクエリを実行することができるようにする

注意、PDO用emulation modeON

+0

を私は彼が望んでいるものだとは思いません。これは、 'first_name'が一致する値を持つか、それがnullの場合に一致します。しかし、私が理解しているように、彼は 'first_name'を何でも一致させたいと思っています(その列にWHERE句がまったくないように)。 – netcoder

+0

@netcoder first_nameがヌルかどうかをチェックしていません。 '(first_name = @varまたは@varがヌルであるかどうかを確認しています)' –

+0

ああ、そうです、あまりにも速く読んでいます:) – netcoder

1

を投入する必要がある...と役立ついくつかのライブラリがあります。クエリを組み立てる。私は過去にZend_Db_Selectを使用しましたが、すべてのフレームワークは、おそらく何か似ています

$select = new Zend_Db_Select; 

$select->from('people'); 

if (!empty($lastName)) { 
    $select->where('lastname = ?', $lastname); 
} 

$select->order('lastname desc')->limit(10); 

echo $select; // SELECT * FROM people WHERE lastname = '...' ORDER BY lastname desc LIMIT 10 
2

まず、単純にあなたの$sql文字列を変更することで起動します。

$sql = 'SELECT * FROM people WHERE 1 = 1'; 

WHERE 1 = 1はあなたがいずれかを含めないようになります追加パラメータ...

次に、$sql文字列に、意味のある値を持つ追加パラメータを選択的に連結します。

$sql .= ' AND first_name = :first_name' 
$sql .= ' AND age = :age' 

あなた$sql文字列は、今だけ、あなたが提供する予定のパラメータが含まれているので、あなたが以前のように進めることができます。

$query = $db->prepare($sql); 
$query->execute(array(':first_name' => 'John', ':age' => '27'); 
0

私は@juergenによって与えられたソリューションをテストしてみたが、それはので、PDOExceptionを与えますバインドされた変数の数が一致しません。下記の(それほどエレガントではない)のコードに関係なく、パラメータの無いの作品:

function searchPeople($inputArr) 
{ 
    $allowed = array(':first_name'=>'first_name', ':last_name'=>'last_name', ':age'=>'age', ':sex'=>'sex'); 

    $sql = 'SELECT * FROM sf_guard_user WHERE 1 = 1'; 

    foreach($allowed AS $key => $val) 
    { 
     if(array_key_exists($key, $inputArr)){ 
      $sql .= ' AND '. $val .' = '. $key; 
     } 
    } 

    $query = $db->prepare($sql); 
    $query->execute($inputArr); 
    return $query->fetchAll(); 
} 

用途:

$result = searchPeople(array(':first_name' => 'John', ':age' => '27')); 
+0

名前付きパラメータとPHP + PDOの最新バージョンを使用していますか?それは私のためにうまく動作します。 – kotekzot

+0

はい、mysqlnd 5.0.7で名前付きのパラメータとPHP 5.3.5を使用しています。上記のコードは正常に動作しますが、$ sql文字列を@juergenの文字列に置き換えるだけでは、PDOExceptionが返されます。彼の方法は確かによりエレガントで、私はそれを使用することを好むだろう。どんなアイデアが間違っているのでしょうか? – qais

+0

不要なパラメータにはnullを指定する必要があります。 – kotekzot