繁体   English   中英

允许用户搜索MySQL数据库时处理不同SQL搜索查询的最佳方法

[英]Best way to handle different SQL search queries when allowing users to search a MySQL database

我在描述这个“问题”时遇到了一些麻烦。 请随意将标题更改为更具描述性的主题。

我有一个数据库,希望让用户有机会选择如何对结果进行排序,搜索数据库等。

我正在使用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 ,或者是否可以在一个查询中进行?

我不需要完成代码片段,我只需要知道是否有任何好的文章或“最佳实践” - 这样做。 最简单,最安全的方法是首选。

PS你怎么称呼这种'问题'?

在搜索查询功能中,只需搜索字段,选项等,然后构建查询字符串。 如果SELECT语句将始终提取相同的字段,那么您可以从创建查询到WHERE子句开始,然后从那里构建。 (确保保护用户输入免受sql注入攻击 。使用预处理语句或手册中的暗示方法(由我的前代码中的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";
}

简单地说,您提出了一个表示其实际请求的模型,然后您可能会将该模型显示为动态创建的SQL语句,该语句将返回其查询的相应数据。

例如,如果他们只想要年龄,性别,按命中排序,您就会知道不打扰加入Cars表(因为他们不需要该表中的任何内容)。 而如果他们确实想要汽车模型,您可以根据需要添加联接。

您可以将所有这些选项括在switch语句中,并将URL $_GET变量传递给它。

例如,要自定义排序,请将sort_by变量传递给URL:

/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";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM