我正在尝试执行一些查询以获取有关某些图像的信息页面。我写了一个函数
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 :(得分:36)
那是因为您的查询中存在错误。 MySQli->query()
将在出错时返回false。将其更改为::
$result = $this->database->query($query);
if (!$result) {
throw new Exception("Database Error [{$this->database->errno}] {$this->database->error}");
}
如果出现错误,应该抛出异常......
答案 1 :(得分:10)
您的查询很可能失败,并且查询调用返回了一个布尔值FALSE(或某种类型的错误对象),然后您尝试使用它,就好像它是一个结果集对象一样,从而导致错误。尝试使用var_dump($result)
之类的东西来查看你真正得到的东西。
在每次数据库查询调用后检查错误。即使查询本身在语法上是有效的,但它仍然有很多原因导致失败 - 每次检查错误都会在某些时候为您节省很多麻烦。
答案 2 :(得分:3)
我的查询中碰巧错过了空格而且出现了这个错误。
Ex: $sql= "SELECT * FROM";
$sql .= "table1";
虽然示例可能看起来很简单,但在编写复杂查询时,此错误的概率很高。我在单词“table1”之前错过了空格。
答案 3 :(得分:-1)
请检查您是否已关闭数据库连接。 在我的情况下,我收到错误,因为连接在上线接近。