2012-04-16 41 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";