2009-08-07 15 views
3

これは簡単な作業のようですが、私はこのために欲しい解決策を見つけるのは難しいです。私はclunky以外の何かを考え出す何かを見つけることができません。ここに私が働いているもの:投稿された変数に基づいてMySQLクエリを構築する

処理スクリプトに変数を投稿する検索フォームがあります。これらの変数は、照会されるデータのフィルターです。ユーザーの権限によっては、アクセスするフィルタによっては、変数が多少入ってくることがあります。各フィルタは、基本的に結果が出てくるテーブル内のフィールドを参照します。各フィルタの1つのオプションは "ANY"であるため、WHERE句は必要ありません。

クエリ文字列を作成するにはどうすればよいですか。たとえば、$ firstname、$ lastname、$ age、$ dobの4つの変数が返ってきたとします。しかし、$ ageと$ dobでフィルタリングするアクセス権を持っているのは、一部のユーザだけです。

$query = "SELECT * FROM people"; 
if(($firstname != 'ANY' && !empty($firstname)) || 
    ($lastname != 'ANY' && !empty($lastname)) || 
    ($age != 'ANY' && !empty($age)) || 
    ($dob != 'ANY' && !empty($dob))) { 
    $query .= " WHERE"; 
} 

if($firstname != 'ANY' && !empty($firstname)) { 
    $query .= " firstname='$firstname'"; 
} 
if($lastname != 'ANY' && !empty($lastname)) { 
    if($firstname != 'ANY' || !empty($firstname)) { 
     $query .= " AND"; 
    } 
    $query .= " lastname='$lastname'"; 
} 
... 

など。しかし、それはちょうど私にはダム、恐ろしい、とばかげて非効率的に見えます。私は若干変更されたMVCパターンを使用しているので、可能な各フィルタの検索モデルでメソッドを構築するのは理にかなっていますか?あなたはこの拡張でき

+0

あなたが行っている可能性がありますが、スペースが足りなくなるという副言として、*を使用するのではなくフィールドを指定してください。 –

答えて

5

を私はこのために行くだろう:

 
$query = "SELECT * FROM people"; 

$whereClause = " WHERE 1 = 1 "; 
if($firstname != 'ANY' && !empty($firstname)) { 
    $whereClause .= " AND firstname='$firstname' "; 
} 
if($lastname != 'ANY' && !empty($lastname)) { 
    $whereClause .= " AND lastname='$lastname' "; 
} 

$query .= $whereClause; 

あなたは、代わりに配列にすべての文を収集し、ちょうど行くことができる:

 
if (count($arr)>0) { 
    $query = "$query 
       WHERE ". implode(" AND ",$arr); 
} 
+0

このようなアプローチは考えていません。私はまだ何らかのパターンや何かを続けることができるように感じていますが、これは少なくとも今のところコードをきれいにするでしょう。 –

+0

これはきれいなアプローチです。実際に私はNathanのオープナーとこの返事の両方から私のコードを改善することができます。私はNathanの質問に対する一般的な答えは "うん、PHPはちょっと複雑に見えるかもしれないと思う。私は調整しておきます - 多分私は間違っています。 (多分、私はPDOを他のポストされた回答ごとに調べるべきです。) – Smandoli

+0

複数の変数を扱う場合、その値に応じて最終結果が変わります。何があっても複雑になるでしょう。違いは、読みにくくするのではなく読みやすくすることです。私はまだそれを持って遊んでいる - 私は本当に失われている何かがあるように感じる。 –

0
+0

残念ながら私はこの時点ではPDOを利用していません。それは間違いなく私が探しているものです。私はこのコードの一部を継承し、私は一度に多くを変えることができます。 –

+0

ユーザーは次のようにリダイレクトされます。http://github.com/indeyets/MySQL-Query-Builder/tree/master – Smandoli

0

ここにいくつかのコードがあり、投稿されたすべての変数と文字列を引き出すあなた。

foreach($_POST as $name=>$value){ 
    $arrFields[] = $name." = '".$value."'"; 
} 
$sSql = "SELECT * FROM people WHERE 1 AND ".implode(" AND ",$arrFields); 

ORは、あなたのフィールド名は、テーブル名と同じでない場合、またはあなたのSQLで異なるフィールドを扱いたい場合は、スイッチを使用することができます。

foreach($_POST as $name=>$value){ 
    switch($name){ 
     case "firstname": 
      $arrFields[] = "fName = '".$value."'"; 
      break; 
     case "lastname": 
      $arrFields[] = "lName = '".$value."'"; 
      break; 
     case "age": 
      $arrFields[] = "bioAge >= ".$value; 
      break; 
    } 
} 
$sSql = "SELECT * FROM people WHERE 1 AND ".implode(" AND ",$arrFields); 
関連する問題