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'])){

	    }

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

Из этого следует вопрос - как можно сформировать запрос, не делая огромных вложенных конструкций из условных блоков?
  • Вопрос задан
  • 144 просмотра
Решения вопроса 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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
30 апр. 2024, в 22:44
500 руб./в час
30 апр. 2024, в 21:45
20000 руб./за проект
30 апр. 2024, в 21:36
1500 руб./в час