Задать вопрос
alekseyHunter
@alekseyHunter
Android developer

Как лаконично сформировать SQL-запрос на основе параметров из GET-запроса?

Добрый день.

Сейчас пишу свой API, и столкнулся с проблемой по обработке параметров, которые будут подставляться в SQL-запрос.

Недавно смотрел VK API, в каждом их методе доступно много параметров. Пусть таких параметров N штук, а в запросе может применяться от 1 до N, тогда количество возможных сочетаний равно сумме n!/(n−k)!*k!, где k от 1 до N.

Например, вариант для 3 параметров:
if(isset($_GET['exams']) && isset($_GET['qualification']) && isset($_GET['formEdication'])){
	   		
	    }
	    else if(isset($_GET['exams']) && isset($_GET['qualification']) && !isset($_GET['formEdication'])){

	    }
	    else if(!isset($_GET['exams']) && isset($_GET['qualification']) && isset($_GET['formEdication'])){

	    }
	    else if(isset($_GET['exams']) && !isset($_GET['qualification']) && isset($_GET['formEdication'])){

	    }
	    else if(isset($_GET['exams']) && isset($_GET['qualification']) && !isset($_GET['formEdication'])){

	    }
	    else if(!isset($_GET['exams']) && !isset($_GET['qualification']) && isset($_GET['formEdication'])){

	    }
	    else if(isset($_GET['exams']) && !isset($_GET['qualification']) && !isset($_GET['formEdication'])){

	    }
	    else if(!isset($_GET['exams']) && isset($_GET['qualification']) && !isset($_GET['formEdication'])){

	    }

Чем больше будет параметров, тем больше получится вариантов запроса.

Из этого следует вопрос - как можно сформировать запрос, не делая огромных вложенных конструкций из условных блоков?
  • Вопрос задан
  • 149 просмотров
Подписаться 1 Простой 17 комментариев
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Если задача извлечения данных по набору параметров из базы, то запрос можно конструировать, безо всяких многоэтажных условий.

Примерно так:

$filters = array();
$values = array();

foreach(array("user_id","city","age","name") as $key) {
  if (isset($_GET[$key])) {
    $filters []= "$key = ?";
    $values []= $_GET[$key];
  }
}

$sth = $dbh->prepare("SELECT * FROM users WHERE ".implode(" AND ", $filters);
$sth->execute($values);


Тут для всех указанных запросов накапливаются условия фильтра и значения в два массива, один затем через AND используется в WHERE, а второй передаётся при выполнении запроса.

Но реальные сложные проекты так не делают. У них может быть ORM, кэширование и много всякой другой магии, цель которой - увеличить скорость выполнения запросов и уменьшить лишнюю активность. Ну и базы данных могут бычть частично или полностью быть совсем не SQL.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽