Подтвердить что ты не робот

Неустранимая ошибка: вызов функции-члена fetch_assoc() для не-объекта

Я пытаюсь выполнить несколько запросов, чтобы получить страницу информации о некоторых изображениях. Я написал функцию

function get_recent_highs($view_deleted_images=false)
{
    $lower = $this->database->conn->real_escape_string($this->page_size * ($this->page_number - 1));
    $query = "SELECT image_id, date_uploaded FROM `images` ORDER BY ((SELECT SUM( image_id=`images`.image_id ) FROM `image_votes` AS score) / (SELECT DATEDIFF( NOW( ) , date_uploaded ) AS diff)) DESC LIMIT " . $this->page_size . " OFFSET $lower"; //move to database class
    $result = $this->database->query($query);
    $page = array();
    while($row = $result->fetch_assoc())
    {
        try
        {
            array_push($page, new Image($row['image_id'], $view_deleted_images));
        }
        catch(ImageNotFoundException $e)
        {
            throw $e;
        }
    }
    return $page;
}

который выбирает страницу этих изображений в зависимости от их популярности. Я написал класс Database, который обрабатывает взаимодействия с базой данных и класс Image, который содержит информацию об изображении. Когда я пытаюсь запустить это, я получаю сообщение об ошибке.

Fatal error: Call to a member function fetch_assoc() on a non-object

$result - это набор результатов mysqli, поэтому я не понимаю, почему это не работает.

4b9b3361

Ответ 1

Это потому, что в вашем запросе была ошибка. MySQli->query() вернет false при ошибке. Измените его на что-то вроде:

$result = $this->database->query($query);
if (!$result) {
    throw new Exception("Database Error [{$this->database->errno}] {$this->database->error}");
}

Это должно вызвать исключение, если есть ошибка...

Ответ 2

Скорее всего, ваш запрос завершился неудачно, и вызов запроса возвратил логический FALSE (или какой-либо объект ошибки), который затем вы пытаетесь использовать, как если бы был объект resultet, вызывая ошибку. Попробуйте что-то вроде var_dump($result), чтобы узнать, что вы действительно получили.

Проверьте наличие ошибок после вызова запроса к базе данных. Даже если сам запрос синтаксически действителен, слишком много причин для его отказа в любом случае - проверка ошибок каждый раз в какой-то момент сэкономит вам много горя.

Ответ 3

Мне не хватает пробелов в моем запросе, и эта ошибка возникает.

Ex: $sql= "SELECT * FROM";
$sql .= "table1";

Хотя пример может выглядеть просто, при кодировании сложных запросов вероятность этой ошибки высока. Мне не хватало пробела перед словом "table1".