2010-01-19 55 views
1

好吧,在我的网站上,我们有一个过滤器部分,用户可以根据游戏的流派或游戏的模型来选择过滤游戏。使用PHP和MySQL查询网站过滤器

我想写一个查询,将查询数据库,并按流派过滤,如果流派是唯一的设置项目,按模型过滤它,如果模型是唯一的设置项目,或者过滤两个,如果他们都组。我希望代码也很有效率,所以如果你知道这样做的好方法,听起来很棒。

回答

2

假设变量$genre$model已逃走。仅用于演示代码,为了清晰起见没有安全性。

$sqlQuery = 'select * from games where 1=1'; 
if (!empty($genre)) $sqlQuery .= " and genre=$genre"; 
if (!empty($model)) $sqlQuery .= " and model=$model"; 
+0

不要忘记为了安全而逃避投入。 – 2010-01-19 18:05:40

+0

绝对棒!简单,正是我所需要的!谢谢!是的,我知道如何逃避投入并保护一切。 – NessDan 2010-01-19 18:08:00

+0

我实际上现在有一个单独的问题。看着我的查询,我不能在最后有WHERE。 $ sql =“SELECT * FROM appinfo ORDER BY rating_score/rating_num DESC LIMIT 5”; 除非有办法将它放在最后,否则不会抛出错误。 – NessDan 2010-01-19 18:31:41

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); 
+1

如果他稍后决定他想要五个或六个过滤器而不是两个,这会变得非常混乱。 – mynameiscoffey 2010-01-19 18:03:23

+0

虽然您的答案较短,可能很可能用于缩短上面的代码,但通常需要5或6个过滤器的查询将足够复杂以保证其他逻辑。 – user250120 2010-01-28 17:39:03

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