2012-04-16 4 views
2

私はこの「問題」を説明するいくつかの問題を抱えていました。この主題をよりわかりやすいものに変更してください。ユーザがMySQLデータベースを検索できるようにするときに、異なるSQL検索クエリを処理する最良の方法

私はPHPとMySQLを使用しています

データベースを持っており、ユーザーに結果をソートする方法を選択する機会を与えたい、データベースを検索し、など。

私は、一例として、このテーブルのセットアップをした:データベースからデータを選択する方法は、このようなことができ

table Persons 
+----+------+----------+------------+------+-----+ 
| id | age | gender | date  | hits | car | 
+----+-----------------+------------+------+-----+ 
| 1 | 18 | male  | xx.xx.xxxx | 1040 | 1 | 
| 2 | 35 | female | xx.xx.xxxx | 443 | 2 | 
| 3 | 67 | male  | xx.xx.xxxx | 453 | 2 | 
| 4 | 10 | male  | xx.xx.xxxx | 3454 | 4 | ==> 4 means Citroen 
| 5 | 98 | female | xx.xx.xxxx | 323 | 6 | 
+----+------+----------+------------+------+-----+ 

table Cars 
+----+----------+ 
| id | model | 
+----+----------+ 
| 1 | Porche | 
| 2 | Ferrari | 
| 3 | Volvo | 
| 4 | Citroen | 
| 5 | VW  | 
+----+----------+ 

を:

$sql = "SELECT *, DATE_FORMAT(date, '%b %e, %Y') AS show_date FROM persons ORDER BY date DESC LIMIT 100"; 

しかし、私は、ユーザーを与えたい場合はどのような日付別、ヒット数別、格付け別(別の表)、降順および昇順の両方でソートする機会、および男性(例えば)の性別でX歳未満の人のみを選択する機会が含まれます。私はこれをどのようにして行うのですか?すべての可能なクエリーに対してif elseを作成する必要がありますか、または1つのクエリで可能ですか?

フィニッシュコードスニペットは必要ありません。いい記事があるか、ベストプラクティスであるかを知る必要があります。最も簡単で最も安全な方法が好ましい。

P.S.あなたはこの種の「問題」を何と呼んでいますか?

答えて

4

検索クエリ機能では、フィールド、オプションなどを検索し、クエリ文字列を構築します。 SELECTステートメントが常に同じフィールドをプルする場合は、WHERE句までのクエリを作成してそこから構築することで開始できます。 (。。。sql injection attacksからのユーザ入力を保護することを確認します私の元にgetSqlVal()によって定義された(手動コードから準備された文、または暗示の方法を使用します))ここで小さな例です:

$sql = "SELECT ... FROM Persons p, Cars c WHERE p.car = c.id"; 

if(isset($_POST["age"])) 
    $sql .= " AND age < " . getSqlVal($_POST["age"], 'int'); 
if(isset($_POST["gender"])) 
    $sql .= " AND gender = '" . getSqlVal($_POST["gender"], 'text') . "'"; 
if(isset($_POST["sortBy"])){ 
    $sql .= " ORDER BY " . getSqlVal($_POST["sortBy"], 'text'); 
    if(isset($_POST["sortDirection"]) && $_POST["sortDirection"] == "DESC") 
     $sql .= " DESC"; 
} 
3

実際のリクエストを表すモデルを作成するだけで、そのモデルを動的に作成されたSQL文にマニフェストして、クエリの適切なデータを返すことができます。

たとえば、年齢、性別、ヒット数で並べ替えたい場合は、Carsテーブルへの参加を気にしないでください(そのテーブルから何も必要ないため)。一方、車のモデルが必要な場合は、必要に応じて結合を追加します。

2

これらのオプションをすべてswitchステートメントに入れて、URLに$_GETという変数を渡すことができます。並べ替えをカスタマイズするために例えば

、URLにsort_by変数を渡す:

/my_list.php?sort_by=hits 

と、このようなswith声明構築:

$sort_by = ''; 
switch ($_GET['sort_by']) { 
    case 'rating': 
     $sort_by = ' ORDER BY `rating` '; 
     break; 
    case 'hits': 
     $sort_by = ' ORDER BY `hits` '; 
     break; 
    default: 
     $sort_by = ' ORDER BY `date` '; 
     break; 
} 

を次に、あなたのクエリは次のようになります。

$sql = "SELECT *, DATE_FORMAT(date, '%b %e, %Y') AS show_date 
     FROM persons " 
     . $sort_by . 
     "DESC LIMIT 100"; 
関連する問題