Задать вопрос

Как сделать, чтобы в случае, если пользователь не указал диапазон цен — SQL запрос не крашился?

Камрады, прошу помощи, возникла следующая проблема.

В учебных целях делаю "интернет-магазин наручных часов".
Сверстал страничку а-ля "яндекс-маркет", где можно по фильтрам послать базе данных запрос на то, чтобы отобразить только такие бренды/такого ценового диапазона/с таким то корпусом/и т. д.
5d34f55c17540836454703.png

В итоге начал с внесения цены от/до и написал примерно такую функцию:

function search($from, $before) {
            $sql = "SELECT * FROM watches WHERE price > $from AND price < $before";
            $stmt = $this->_instance->query($sql);
            $row = $stmt->fetchAll(PDO::FETCH_ASSOC);
            return $row;
        }


Функция теоретически отрабатывает, если пользователь при внесении данных в фильтр указал диапазон цен "от" и "до".
Но если в функцию не приходят $from и $before, то SQL запрос крашится.
Вопрос, как сделать, чтобы в случае, если пользователь не указал диапазон цен - SQL запрос не крашился, а просто показывал всю продукцию, которая есть в наличии.
Была идея указать function search($from=0, $before=9999999999) {...}, но это как то грубо, наверное есть более изящное решение?
  • Вопрос задан
  • 290 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 2
VladimirAndreev
@VladimirAndreev
php web dev
$select = 'select * from watches where 1=1';
$binds = [];
if(!empty($from)) {
    $select .= ' and from>=?';
    $binds[] = $from;
}
if(!empty($before)) {
    $select .= ' and before<=?';
    $binds[] = $before;
}
$stmt = $this->_instance->prepare($sql);
$stmt->execute($binds);
$items = $stmt->fetchAll(PDO::FETCH_ASSOC);
Ответ написан
Ahen
@Ahen
Универсальный дилетант
Типа (не тестил):
function search($from, $before) {
    $sql = "SELECT * FROM watches";
    if (isset(($from) && isset(($before)) {
        $sql .= " WHERE price > {$from} AND price < {$before}";
    }
    $stmt = $this->_instance->query($sql);
    $row = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $row;
}

Откуда приходят значения в функцию? Перед использованием в sql запросах ОБЯЗАТЕЛЬНО нужно отфильтровать входные данные, иначе дыра.
И стоит сразу учесть, что брать из базы абсолютно все - плохо. На сайте же будет пагинация, вот на основе этой пагинации и нужно составлять запрос.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы