@SteveJ42

Почему возникает ошибка «Call to a member function fetch() on boolean»?

В методе модели класса делал запрос к базе и через цикл расставлял все по ячейкам массива и выходит какая то ошибка 'Uncaught Error: Call to a member function fetch() on boolean'
Искал в сети. пишут что ошибка в OpenServer но мне так не кажется.
Кто сталкивался с такой ошибкой?
Потом использую этот метод в другом контроллере
public static function getProducts($count = self::SHOW_BY_DEFAULT)
    {
        $db = Db::getConnection();
        $productsList = array();

        $result = $db->query('SELECT id, name, price FROM product '
                . 'WHERE status = "1"'
                . 'ORDER BY id DESC '                
                . 'LIMIT ' . $count);

        $i = 0;
        while ($row = $result->fetch()) {
            $productsList[$i]['id'] = $row['id'];
            $productsList[$i]['name'] = $row['name'];
            $productsList[$i]['price'] = $row['price'];
            $i++;
        }

        return $productsList;
    }
  • Вопрос задан
  • 4481 просмотр
Пригласить эксперта
Ответы на вопрос 3
@asmodeusta
PHP Developer (Laravel, Wordpress)
public static function getProducts($count = self::SHOW_BY_DEFAULT)
    {
        $db = Db::getConnection();
        $productsList = array();

        $st= $db->prepare('SELECT id, name, price FROM product '
                . 'WHERE status = "1"'
                . 'ORDER BY id DESC '                
                . 'LIMIT ' . $count);
        if ($st && $st->execute()) {
            $i = 0;
            while ($row = $st->fetch()) {
                $productsList[$i]['id'] = $row['id'];
                $productsList[$i]['name'] = $row['name'];
                $productsList[$i]['price'] = $row['price'];
                $i++;
            }
        }
        return $productsList;
    }
Ответ написан
@dimoff66
Кратко о себе: Я есть
Ошибка очень красноречивая. Она означает, что вы пытаетесь вызвать метод fetch у значения типа Boolean, это означает что переменная result содержит значение типа boolean, то есть запрос вернул false

Чтобы этой ошибки не было, нужно писать
if ($result = $db->query('SELECT id, name, price FROM product '
                . 'WHERE status = "1"'
                . 'ORDER BY id DESC '                
                . 'LIMIT ' . $count)) {
    // твой код
} else {
    else echo($db->error);
}
Ответ написан
php666
@php666
PHP-макака
Никого не слушай. Должно быть так.
В случае ошибки SQL-запроса - исключительная ситуация. Точка. Это ошибка, которая требует отладки.
Возвращать пустой массив нельзя при ошибке, пустой массив - это значит, что нет товаров, удовлетворяющих условию.
Возвращать false смысла не имеет на клиентском коде типа этого метода.
public static function getProducts($count = self::SHOW_BY_DEFAULT)
{
    $db = Db::getConnection();
    $result = $db->query('SELECT ....');

    if (!$result) {
        throw new \RuntimeException('SQL query error: ' . $db->error());
    }

    $productsList = [];
    while ($row = $result->fetch()) {
        // нет ни малейшего смысла перегонять из пустого в порожнее,
        // т.е. из одного массива в другой
        $productsList[] = $row;
    }

    return $productsList;
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы