Intereting Posts
PHP-фронт-контроллер для включения файла из другой папки, если он не существует Как автоматически удалить сеанс через 5 минут бездействия на веб-сайте в php Безопасность веб-API Как выполнить математику в sql-запросе для вычисления процентной разницы? Декодирование строк запроса в PHP CURL php query формирование – как? PHP / MySQL. Существует ли функция mysql для определения того, существует ли хотя бы 2 определенных слова по меньшей мере в одном поле строки mysql Извлечь листовые узлы многомерного массива в PHP сбой выполнения команды с php и mysql удалить из массива Проверить сертификат php 5.6 ssl Получить конечное значение многомерного массива Лучший способ реализовать шаблон декоратора для кэширования результатов метода в PHP Как распечатать содержимое элемента OBJECT при использовании меню FILE-> PRINT? Как Facebook Post внешне используя Graph Api – пример

PHP и MySQL необязательные условия WHERE

У меня есть следующая проблема: я хочу, чтобы пользователь применял фильтры к поиску БД. У меня есть три фильтра: A, B и C. Все они могут быть «пустыми», так как пользователь не заботится о них и выбирает «Any». Теперь я хочу проверить этот запрос на записи БД. Я использую обычный mysql-запрос, как в

$db_q = "Select * from table where row1 = '" . $A . "' and row2 = '" . $B . "' and row3 = '" . $C . "'"; 

Это прекрасно работает, пока пользователь вводит что-либо конкретное для A, B, C (! = "Any"). Когда выбрано «any», я получаю что-то вроде этого: «Выберите * из таблицы, где row1 =« any / all »и т. Д.» Я не могу понять правильный синтаксис (если это вообще возможно), и я хотел бы избежать беспорядочного разграничения случаев (если A == any, выполнить select, если B == empty .. и т. Д.).

Буду признателен за любую оказанную помощь.

Перед запросом вы можете использовать:

 $tmp = "where "; if($A and $A!="any" and $A!="not used") $tmp .= "row1 = '".$A."'"; if($B and $B!="any" and $B!="not used") $tmp .= "AND row2 = '".$B. "'"; if($C and $C!="any" and $C!="not used") $tmp .= "AND row3 = '".$C."'"; $db_q = "Select * from table $tmp"; 

Другие ответы в основном правильны, но это более простой способ выполнить то, что необходимо:

 $where = array(); if($A != 'any'){ // or whatever you need $where[] = "A = $A'"; } if($B != 'any'){ // or whatever you need $where[] = "B = $B'"; } if($C != 'any'){ // or whatever you need $where[] = "C = $C'"; } $where_string = implode(' AND ' , $where); $query = "SELECT * FROM table"; if($where){ $query .= ' ' . $where_string; } 

Это позволит использовать любую комбинацию условий и расширения.

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

 $db_q = "Select * from table "; if ($A != "any" || $B != "any" || $C != "any") { $db_q .= "where "; } $firstCondition = true; if ($A != "any") { if (!$firstCondition) $db_q .= "and "; $db_q .= "row1 = '$A' "; $firstCondition = false; } if ($B != "any") { if (!$firstCondition) $db_q .= "and "; $db_q .= "row2 = '$B' "; $firstCondition = false; } if ($C != "any") { if (!$firstCondition) $db_q .= "and "; $db_q .= "row3 = '$C' "; $firstCondition = false; } 

Попробуйте сделать что-то вроде этого:

 if @param1 is not null select * from table1 where col1 = @param1 else select * from table1 where col2 = @param2 

Это можно переписать:

 select * from table1 where (@param1 is null or col1 = @param1) and (@param2 is null or col2 = @param2) 

Получил идею из блога Барона Шварца: https://www.xaprb.com/blog/2005/12/11/optional-parameters-in-the-where-clause/