致命错误:调用非对象上的成员函数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; } 

根据它们的stream行度来select这些图像的一个页面。 我写了一个处理与数据库交互的数据库类和一个保存图像信息的Image类。 当我尝试运行这个,我得到一个错误。

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

$result是一个mysqli结果集,所以我很困惑为什么这不起作用。

这是因为您的查询中有错误。 MySQli->query()将在错误时返回false。 将其更改为像::

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

如果出现错误,应该会引发exception…

最有可能的是你的查询失败,查询调用返回一个布尔值FALSE(或某种错误对象),然后尝试使用,就好像是一个resultset对象,导致错误。 试试类似var_dump($result)来看看你真的得到了什么。

每个数据库查询调用后检查错误。 即使这个查询本身在语法上是有效的,它的失败原因也有太多的原因 – 每次检查错误都会为你节省很多的时间。

我碰巧在我的查询错过空格,这个错误来了。

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

虽然这个例子看起来很简单,但在编码复杂的查询时,这个错误的概率很高。 我在“table1”之前缺less空格。