Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

php

mysqli

I'm trying to execute a few queries to get a page of information about some images. I've written a function

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;
}

that selects a page of these images based on their popularity. I've written a Database class that handles interactions with the database and an Image class that holds information about an image. When I attempt to run this I get an error.

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

$result is a mysqli resultset, so I'm baffled as to why this isn't working.

like image 206
nickles Avatar asked Feb 25 '11 18:02

nickles


3 Answers

That's because there was an error in your query. MySQli->query() will return false on error. Change it to something like::

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

That should throw an exception if there's an error...

like image 119
ircmaxell Avatar answered Oct 22 '22 01:10

ircmaxell


Most likely your query failed, and the query call returned a boolean FALSE (or an error object of some sort), which you then try to use as if was a resultset object, causing the error. Try something like var_dump($result) to see what you really got.

Check for errors after EVERY database query call. Even if the query itself is syntactically valid, there's far too many reasons for it to fail anyways - checking for errors every time will save you a lot of grief at some point.

like image 41
Marc B Avatar answered Oct 22 '22 00:10

Marc B


I happen to miss spaces in my query and this error comes.

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

Though the example might look simple, when coding complex queries, the probability for this error is high. I was missing space before word "table1".

like image 3
Upendra Bittu Avatar answered Oct 22 '22 01:10

Upendra Bittu