PHP SQL: способ пропустить раздел запроса, если переменная пуста

Я пишу запрос, который использует входные данные из формы поиска, где Brand, Type и Price являются необязательными полями ввода:

SELECT * FROM `database` WHERE `brand` LIKE "%' . $brand . '%" AND `type` LIKE "%' . $type. '%" AND `price` LIKE "%' . $price . '%" 

Мне интересно, есть ли способ сказать «все», если в одно из полей ничего не вводится. Например, если они не вводят значение в поле цены, есть способ сказать SQL просто сказать, что игнорировать этот раздел, например:

 AND `price` LIKE "*"; 

Таким образом, повторные действия по-прежнему фильтруются Brand и Type, но могут иметь любую цену.

Любые советы по этому поводу оцениваются! благодаря

Solutions Collecting From Web of "PHP SQL: способ пропустить раздел запроса, если переменная пуста"

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

 <?php $sql = 'SELECT * FROM `database`'; $where = array(); if ($brand !== '') $where[] = '`brand` LIKE "%'.$brand.'%"'; if ($type !== '') $where[] = '`type` LIKE "%'.$type.'%"'; if ($price !== '') $where[] = '`price` LIKE "%'.$price.'%"'; if (count($where) > 0) { $sql .= ' WHERE '.implode(' AND ', $where); } else { // Error out; must specify at least one! } // Run $sql 

ПРИМЕЧАНИЕ . Пожалуйста, пожалуйста, пожалуйста, убедитесь, что содержимое переменной $brand , $type и $price дезинфицировано, прежде чем использовать их таким образом, или вы сделаете себя уязвимыми для SQL-инъекций (в идеале вы должны использовать соединитель базы данных PHP PDO с подготовленными заявлениями по дезинфекции материалов).

Обычно вы делаете это на внешнем языке, а не в SQL.

Но price LIKE '%' действительно означает все (кроме NULL). Так что вы, наверное, в порядке.

Если у вас есть поля формы, вы можете сделать что-то вроде:

 <?php $fields = array( // Form // SQL 'brand' => 'brand', 'type' => 'type', 'price' => 'price', ); $sql = 'SELECT * FROM `database`'; $comb = ' WHERE '; foreach($fields as $form => $sqlfield) { if (!isset($_POST[$form])) continue; if (empty($_POST[$form])) continue; // You can complicate your $fields structure and eg use an array // with both sql field name and "acceptable regexp" to check input // ... // This uses the obsolete form for mysql_* $sql .= $comb . $sqlfield . ' LIKE "%' . mysql_real_escape_string($_POST[$form]) . '"'; /* To use PDO, you would do something like $sql .= $comb . $sqlfield . 'LIKE ?'; $par[] = $_POST[$form]; */ $comb = ' AND '; } // Other SQL to go here $sql .= " ORDER BY brand;"; /* In PDO, after preparing query, you would bind parameters - $par[0] is value for parameter 1 and so on. foreach($par as $n => $value) bindParam($n+1, '%'.$value.'%'); */