我在描述这个“问题”时遇到了一些麻烦。请随意将标题更改为对此主题更具描述性的内容。
我有一个数据库,希望让用户有机会选择如何对结果进行排序,搜索数据库等。
我正在使用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。你怎么称呼这种'问题'?
答案 0 :(得分: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";
}
答案 1 :(得分:3)
简单地说,您想出了一个代表其实际请求的模型,然后您可能会将该模型显示为动态创建的SQL语句,该语句将为其查询返回相应的数据。
例如,如果他们只想要年龄,性别,按点击排序,您就会知道不打扰加入Cars表(因为他们并不需要该表中的任何内容)。如果他们确实想要汽车模型,您可以根据需要添加连接。
答案 2 :(得分:2)
您可以将所有这些选项括在switch
语句中,并将网址$_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";