致命错误:在非对象上调用成员函数fetch_assoc()

nic*_*les 30 php mysqli

我正在尝试执行一些查询以获取有关某些图像的信息页面.我写了一个函数

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;
}
Run Code Online (Sandbox Code Playgroud)

根据其受欢迎程度选择这些图像的页面.我编写了一个Database处理与数据库交互的Image类和一个包含图像信息的类.当我试图运行它时,我得到一个错误.

Fatal error: Call to a member function fetch_assoc() on a non-object
Run Code Online (Sandbox Code Playgroud)

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

irc*_*ell 36

那是因为您的查询中存在错误. MySQli->query()将在错误时返回false.把它改成像::

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

如果出现错误,应该抛出异常......

  • `致命错误:在不在对象上下文中时使用$ this (4认同)

Mar*_*c B 10

很可能您的查询失败了,并且查询调用返回了一个布尔值FALSE(或某种类型的错误对象),然后您尝试使用它,就好像是一个结果集对象一样,从而导致错误.尝试一下var_dump($result),看看你真正得到了什么.

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