Я пишу запрос, который использует входные данные из формы поиска, где Brand, Type и Price являются необязательными полями ввода:
SELECT * FROM `database` WHERE `brand` LIKE "%' . $brand . '%" AND `type` LIKE "%' . $type. '%" AND `price` LIKE "%' . $price . '%"
Мне интересно, есть ли способ сказать «все», если в одно из полей ничего не вводится. Например, если они не вводят значение в поле цены, есть способ сказать SQL просто сказать, что игнорировать этот раздел, например:
AND `price` LIKE "*";
Таким образом, повторные действия по-прежнему фильтруются Brand и Type, но могут иметь любую цену.
Любые советы по этому поводу оцениваются! благодаря
Как отметил Ариэль, было бы лучше, если бы 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.'%'); */