【问题标题】:Best way to handle different SQL search queries when allowing users to search a MySQL database允许用户搜索 MySQL 数据库时处理不同 SQL 搜索查询的最佳方式
【发布时间】:2012-04-28 00:21:03
【问题描述】:

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

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

我正在使用 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,还是可以在一个查询中使用?

我不需要完成代码 sn-p,我只需要知道是否有任何好的文章或“最佳实践”方式来做到这一点。首选最简单、最安全的方法。

附:你怎么称呼这种“问题”?

【问题讨论】:

    标签: php mysql database select


    【解决方案1】:

    在您的搜索查询功能中,只需获取搜索字段、选项等并构建您的查询字符串。如果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";
    }
    

    【讨论】:

      【解决方案2】:

      简单地说,您想出一个代表他们实际请求的模型,然后您很可能将该模型体现在一个动态创建的 SQL 语句中,该语句为他们的查询返回适当的数据。

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

      【讨论】:

        【解决方案3】:

        您可以将所有这些选项包含在 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";
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-20
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          • 2010-10-12
          • 1970-01-01
          相关资源
          最近更新 更多