好吧,在我的網站上,我們有一個過濾器部分,用戶可以根據遊戲的流派或遊戲的模型來選擇過濾遊戲。使用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