Фильтр веб-сайта с использованием PHP и MySQL Query - PullRequest
1 голос
/ 19 января 2010

Хорошо, поэтому на моем сайте есть раздел фильтров, в котором пользователь может выбрать фильтрацию по играм по жанру или по модели игры.

Я пытаюсь написать запрос, который будет запрашивать базу данных и фильтровать ее по жанру, если жанр является единственным элементом набора, фильтровать его по модели, если модель является единственным элементом набора, или фильтровать оба, если они оба установлены. , Я хочу, чтобы код также был эффективным, поэтому, если вы знаете хороший метод для этого, было бы здорово услышать.

Ответы [ 3 ]

2 голосов
/ 19 января 2010

при условии, что переменные $genre и $model уже экранированы. только демонстрационный код, без ясности для ясности.

$sqlQuery = 'select * from games where 1=1';
if ( !empty($genre) ) $sqlQuery .= " and genre=$genre";
if ( !empty($model) ) $sqlQuery .= " and model=$model";
1 голос
/ 19 января 2010

Лучший подход - это сначала структурировать вашу базу данных:

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-код должен помочь вам в правильном направлении:

[Мы предполагаем, что идентификаторы ваших жанров 1,2,3, а идентификаторы моделей 10, 11 и 12].

SELECT g.id, g.name, g.description<br> FROM games g, games2genre gg, games2model gm<br> WHERE gg.game_id = g.id<br> AND gm.game_id = g.id<br> AND gg.genre_id IN (1,2,3)<br> AND gm.model_id IN (10,11,12)<br> ORDER BY g.name ASC

1 голос
/ 19 января 2010

Обратите внимание, что в приведенном ниже ответе предполагается, что поля формы содержат значение, к которому следует обращаться. Не забывайте проверять ошибки, и вам нужно будет проверить переменные $ _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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...