2011-02-25 71 views
25

我试图执行一些查询以获取有关某些图像的信息页面。我写了一个功能致命错误:调用非对象的成员函数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的结果集,所以我很困惑,为什么这是行不通的。

+0

$ result上的var_dump证实它是一个mysqli结果集? – erisco 2011-02-25 18:21:56

回答

34

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

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

这应该抛出一个异常,如果有一个错误......

+2

'致命的错误:当不在对象上下文中时使用$ this' – User 2014-09-21 00:50:32

10

您的查询很可能失败,并且查询调用返回布尔值FALSE(或某种错误对象),然后尝试使用它,就好像是resultset对象一样,导致错误。尝试像var_dump($result)这样的东西,看看你真的得到了什么。

每次数据库查询调用后检查错误。即使查询本身在语法上是有效的,但它的失败原因太多了 - 每次检查错误都会在某些时候为您节省很多的麻烦。

3

我碰巧错过我的查询空间和这个错误出现。

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

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

0

请检查您是否已关闭数据库连接。 在我的情况下,我得到的错误,因为连接上线。

+1

请检查是否已经有一个可接受的答案来解答七(!)年的问题,它会告诉你同样的事情 – 2018-02-02 08:20:00

相关问题