Как составить запрос?

Есть админ-панель. Требуется создать фильтрацию отображения входящих заявок.
Параметры:
- 3 типа статуса (на оценке, в работе, завершенные)
- По имени (простое текстовое поле)
- По тегам(минимум 1 тег, максимум 11)

Средствами jquery выбираю тип фильтра:
1 - по статусу
2 - по статусу и марке
3 - по статусу, марке и типу работ

Решил вопрос со статусом и именем, запросы выглядят след.образом:
spoiler
$query1 = mysqli_query($lnk, "SELECT * FROM applications WHERE status='".$_POST['status']."'");
$query2 = mysqli_query($lnk, "SELECT * FROM applications WHERE name='".$_POST['name']."' and status='".$_POST['status']."'");


А вот как быть с третьим типом - не понимаю.

Пробовал что-то такое:
spoiler
$query3 = mysqli_query($lnk, "SELECT * FROM applications WHERE name='".$_POST['name']."' and status='".$_POST['status']."' or type1='".$_POST['tag1']."' or type2='".$_POST['tag2']."' or type3='".$_POST['tag3']."' or type4='".$_POST['tag4']."' or type5='".$_POST['tag5']."' or type6='".$_POST['tag6']."' or type7='".$_POST['tag7']."' or type8='".$_POST['tag8']."' or type9='".$_POST['tag9']."' or type10='".$_POST['tag10']."' or type11='".$_POST['tag11']."'");

Если, допустим, у заявки 5 случайных фильтров, а администратор решил вывести все заявки с N-фильтром, который присутствует среди тех пяти фильтров, то такой вариант 100% не сработает.

Как правильно составить запрос в такой ситуации?
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
lidacriss
@lidacriss
wtf
Добавил еще одно условие, чтобы было более "правильно"
$sql_type_array = [];
for ($i=1; $i<=11; $i++) {
  $tag_name = 'tag' . $i;
  if (isset($_POST[$tag_name]) && (int)$_POST[$tag_name] === 1) {
    $sql_type_array[] = 'type' . $i . ' != NULL';
  }
}
$query3 = mysqli_query($lnk, "SELECT * FROM applications WHERE name='".$_POST['name']."' AND status='".$_POST['status']."' " . implode(' AND ', sql_type_array);

А вообще подобные запросы лучше вообще никогда не делать, когда у вас данные из POST или GET идут сразу в SQL запрос.
В таком случае, как у вас, легко можно осуществить SQL инъекцию
Почитайте про SQL инъекции
phpprofi.ru/blogs/post/35
habrahabr.ru/post/148151/
habrahabr.ru/company/pentestit/blog/326362/
и про подготовленные SQL
php.net/manual/ru/mysqli.quickstart.prepared-state...
php.net/manual/ru/pdo.prepared-statements.php
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы