好的,所以在我的网站上我们有一个过滤器部分,用户可以选择通过游戏类型或游戏模型来过滤游戏。
我正在尝试编写一个查询数据库并根据类型对其进行过滤的查询,如果类型是唯一的设置项,如果模型是唯一的设置项则按模型过滤,或者如果它们都设置则过滤两者。我希望代码也是高效的,所以如果你知道一个很好的方法,那么听起来很棒。
答案 0 :(得分:2)
假设变量$genre
和$model
已经转义。仅限演示代码,为清晰起见,没有安全性。
$sqlQuery = 'select * from games where 1=1';
if ( !empty($genre) ) $sqlQuery .= " and genre=$genre";
if ( !empty($model) ) $sqlQuery .= " and model=$model";
答案 1 :(得分:1)
注意,下面的答案假设表单字段包含要查询的值。不要忘记错误检查,并且您需要验证$ _GET / $ _ POST变量以防止SQL注入类型黑客攻击。
// Generally you would have a function to construct your query here:
function select($where,$orderBy){
...
}
// Then when you when you are ready to build your query
$where = "";
if($model !== 'all'){
$where .= "model ='".$model."'";
$orderBy = "model ASC";
}
if($genre !== 'all'){
if(isset($model)&&($model !== 'all')){
$where .= " AND ";
}
$where .= "genre <='".$genre."'";
$orderBy = "genre ASC";
}
// Adding additional filters will look like this
if($additionalFilter !== 'all'){
if(isset($genre)&&($genre !== 'all')||isset($model)&&($model !== 'all')){
$where .= " AND ";
}
$where .= "additionalFilter <='".$additionalFilter."'";
$orderBy = "additionalFilter ASC";
}
// And finally to put it all together:
select($where, $orderBy);
答案 2 :(得分:1)
最好的方法是首先构建数据库:
Table 'game':
| id | title | description |
Table 'models':
| id | name | description |
Table 'genres':
| id | name | description |
Table 'game2model':
| game_id (FK to game.id) | model_id (FK to models.id) |
Table 'game2genre':
| game_id (FK to game.id) | genre_id (FK to genres.id) |
以这种方式对数据库进行规范化后,进行SQL过滤非常容易。这个伪SQL代码应该让你走在正确的轨道上:
[我们假设您的流派ID为1,2,3且您的模型ID为10,11和12]。
SELECT g.id, g.name, g.description
FROM games g, games2genre gg, games2model gm
WHERE gg.game_id = g.id
AND gm.game_id = g.id
AND gg.genre_id IN (1,2,3)
AND gm.model_id IN (10,11,12)
ORDER BY g.name ASC