Выборка из БД по нескольким параметрам

228
25 октября 2017, 06:39

Есть выборка товаров из БД по нескольким параметрам: Цвет, тип, форма. Пытаюсь сделать поиск товаров по одному или нескольким параметрам.
Например: Хочу найти все товары красного цвета и круглой формы или все товары квадратной формы.

Я пробовал делать так:

SELECT* FROM БД WHERE Цвет ='Красный' AND Тип = 'Б' AND Форма = 'Квадрат'

Однако, при использовании данного запроса, нужные мне товары выводятся только при совпадении всех параметров без исключения, т.е. выбрав, например, "Зеленые" и "Квадратные" я не получу ничего, т.к параметр "Тип" пуст.

Какое условие будет выбирать по параметрам игнорируя невыбранные?

Answer 1

Простой вариант с генерацией запроса.

Для примера у Вас могут поступить 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();
Answer 2
$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();
READ ALSO
Как вывести только назначенные теги на странице?

Как вывести только назначенные теги на странице?

В примере кода работает вывод назначенного производителя на странице:

208
Joomla компонент

Joomla компонент

Для создания нужного дополнения мне требуется кастомная админкаДля этого приходится использовать компонент, но есть одно но

182