2010-01-19 47 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