2012-04-16 42 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,或者是否可以在一個查詢中查找?

我不需要一個完成代碼片段,我只需要知道是否有任何好的文章或「最佳實踐」 - 要做到這一點。最簡單和最安全的方法是首選。

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表(因爲他們不需要該表中的任何內容),所以不需要加入Cars表。而如果他們確實需要汽車模型,則可以根據需要添加連接。

2

您可以將所有這些選項括在switch語句中,並將URL變量$_GET傳遞給它。

例如,自定義排序,通過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";