使用PHP和MySQL查询的网站过滤器

时间:2010-01-19 17:47:58

标签: php mysql search filter

好的,所以在我的网站上我们有一个过滤器部分,用户可以选择通过游戏类型或游戏模型来过滤游戏。

我正在尝试编写一个查询数据库并根据类型对其进行过滤的查询,如果类型是唯一的设置项,如果模型是唯一的设置项则按模型过滤,或者如果它们都设置则过滤两者。我希望代码也是高效的,所以如果你知道一个很好的方法,那么听起来很棒。

3 个答案:

答案 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