Есть выборка товаров из БД по нескольким параметрам: Цвет, тип, форма.
Пытаюсь сделать поиск товаров по одному или нескольким параметрам.
Например: Хочу найти все товары красного цвета и круглой формы или все товары квадратной формы.
Я пробовал делать так:
SELECT* FROM БД WHERE Цвет ='Красный' AND Тип = 'Б' AND Форма = 'Квадрат'
Однако, при использовании данного запроса, нужные мне товары выводятся только при совпадении всех параметров без исключения, т.е. выбрав, например, "Зеленые" и "Квадратные" я не получу ничего, т.к параметр "Тип" пуст.
Какое условие будет выбирать по параметрам игнорируя невыбранные?
Простой вариант с генерацией запроса.
Для примера у Вас могут поступить color
(цвет), type
(тип) и type_form
(форма) и в бд хранится номер цвета или его id
. Если у Вас в БД значение цвета хранится как строка (что мало вероятно) используйте s
вместо i
.
$sql = "SELECT * FROM БД";
$array = array();
if(isset($_POST["color"]))
{
$array[] = array("color", "i", $_POST["color"]);
}
if(isset($_POST["type"]))
{
$array[] = array("color", "i", $_POST["type"]);
}
if(isset($_POST["type_form"]))
{
$array[] = array("color", "i", $_POST["type_form"]);
}
$where = $rows_types = '';
$rows_values = array();
foreach($array as $key=>$arr){
$rows_types .= $arr[1];
$rows_values[] = $arr[2];
if($key > 0){
$where .= " AND "; //выделили отдельной строкой, здесь вы можете проставить логику OR или AND
}
$where .= " `".$arr[0]."` = ?";
}
$sql .= ($where != '') ? " WHERE ". $where : '';
if (!($stmt = $db_conn->prepare($sql))){
echo "Не удалось подготовить запрос: (" . $db_conn->errno . ") " . $db_conn->error;
}
$params = array_merge(array($rows_types), $rows_values);
$refs = array();
foreach($params as $p_key => $p_value){
$refs[$p_key] = &$params[$p_key];
}
call_user_func_array(array($stmt, 'bind_param'), $refs);
$stmt->execute();
$res = $stmt->get_result();
$i = $res->fetch_assoc();
$stmt = $mysqli->prepare('
SELECT *
FROM table
WHERE 1=1
AND color LIKE :color
AND type LIKE :type
AND shape LIKE :shape
');
$color = isset($colorFilter) ? $colorFilter : '%';
$type = isset($typeFilter) ? $typeFilter : '%';
$shape = isset($shapeFilter) ? $shapeFilter : '%';
$stmt->bindValue(':color', $color);
$stmt->bindValue(':type', $type);
$stmt->bindValue(':shape', $shape);
$stmt->execute();
В примере кода работает вывод назначенного производителя на странице:
Для создания нужного дополнения мне требуется кастомная админкаДля этого приходится использовать компонент, но есть одно но