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

	    }

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

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

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

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