好吧,在我的网站上,我们有一个过滤器部分,用户可以根据游戏的流派或游戏的模型来选择过滤游戏。使用PHP和MySQL查询网站过滤器
我想写一个查询,将查询数据库,并按流派过滤,如果流派是唯一的设置项目,按模型过滤它,如果模型是唯一的设置项目,或者过滤两个,如果他们都组。我希望代码也很有效率,所以如果你知道这样做的好方法,听起来很棒。
好吧,在我的网站上,我们有一个过滤器部分,用户可以根据游戏的流派或游戏的模型来选择过滤游戏。使用PHP和MySQL查询网站过滤器
我想写一个查询,将查询数据库,并按流派过滤,如果流派是唯一的设置项目,按模型过滤它,如果模型是唯一的设置项目,或者过滤两个,如果他们都组。我希望代码也很有效率,所以如果你知道这样做的好方法,听起来很棒。
假设变量$genre
和$model
已逃走。仅用于演示代码,为了清晰起见没有安全性。
$sqlQuery = 'select * from games where 1=1';
if (!empty($genre)) $sqlQuery .= " and genre=$genre";
if (!empty($model)) $sqlQuery .= " and model=$model";
请注意,下面的答案假定表单域包含要查询的值。不要忘记错误检查,并且需要验证$ _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);
如果他稍后决定他想要五个或六个过滤器而不是两个,这会变得非常混乱。 – mynameiscoffey 2010-01-19 18:03:23
虽然您的答案较短,可能很可能用于缩短上面的代码,但通常需要5或6个过滤器的查询将足够复杂以保证其他逻辑。 – user250120 2010-01-28 17:39:03
最好的办法是构建数据库,这样第一:
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
不要忘记为了安全而逃避投入。 – 2010-01-19 18:05:40
绝对棒!简单,正是我所需要的!谢谢!是的,我知道如何逃避投入并保护一切。 – NessDan 2010-01-19 18:08:00
我实际上现在有一个单独的问题。看着我的查询,我不能在最后有WHERE。 $ sql =“SELECT * FROM appinfo ORDER BY rating_score/rating_num DESC LIMIT 5”; 除非有办法将它放在最后,否则不会抛出错误。 – NessDan 2010-01-19 18:31:41