Intereting Posts
Подготовленный отчет PHP PDO: могу ли я использовать один заполнитель несколько раз? Можно ли изменить default_socket_timeout из моего php-кода? удалите символы Unicode, но сохраните все специальные и английские символы с preg_replace Что произойдет, если mysql_insert_id будет вызывать разные места и разные браузеры одновременно? Проблемы с настройкой SSL на AWS Elastic Beanstalk Webserver (один экземпляр) PHP Как экспортировать строку Base64 в файл на стороне сервера, не сохраняя его на веб-сервере, напрямую с помощью PHP? обмениваться сеансом между классическим ASP и PHP, чем использовать базу данных Вставить в массив в определенном месте Instagram API Retrieve Hash Media – next_max_id и min_id устарели для этой конечной точки; вместо этого используйте min_tag_id и max_tag_id exec из php вызывает ошибку «Преждевременный конец скриптовых заголовков: php-cgi.exe» Любые проблемы со следующей работой для php-ошибки # 53632 анализировать естественный язык file_get_contents или curl в php? Как получить дисковое пространство на сервере? Запустите функцию JavaScript из оператора php if

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

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

Запрос будет содержать несколько полей, но для получения этой идеи я приведу только три из приведенных ниже:

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

  • Высота – аналогично возрасту

Примеры запросов:

Никаких критериев не было дано:

select * from persons 

Было дано только занятие:

 select * from persons where occupation = 'dentist' 

Было дано несколько занятий:

 select * from persons where (occupation = 'dentist' or occupation = 'engineer') 

Возраст дается как больше, чем стоимость, и он должен существовать в профиле человека:

 select * from persons where age >= 30 

Высота была задана как диапазон, и ее не обязательно присутствовать в профиле человека:

 select * from persons where (height is null or (height >= 30 and height <= 40)) 

Сочетание различных критериев:

 select * from persons where occupation = 'dentist' and age >= 30 and (height is null or (height >= 30 and height <= 40)) 

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

Solutions Collecting From Web of "Как динамически генерировать SQL-запрос на основе пользовательских настроек?"

Попробуйте что-то вроде Zend_Db_Select . Он обеспечивает (свободный) интерфейс для генерации запросов и обработки синтаксиса для вас, например

 $select = $db->select(); $select->from( /* ...specify table and columns... */ ) ->where( /* ...specify search criteria... */ ) ->where( /* ...specify other criteria... */ ) ->order( /* ...specify sorting criteria... */ ); 

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

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

  request = Request->getParams() // selection criteria set from GUI sql = Products->getBaseQuery(request) // basic query for requested View sql = Decorator->applyUserConfig(sql) // custom fixed user filter results = sql->execute() 

Это не будет напрямую отвечать на ваш вопрос, но вот небольшой совет для вас, вместо того, чтобы писать свой запрос следующим образом:

 select * from persons where (occupation = 'dentist' or occupation = 'engineer') 

Попробуй это:

 select * from persons where occupation IN ('dentist','engineer') 

Это легче читать и легко создавать сценарий PHP.

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