无法解释的“调用非对象上的成员函数 bind_param()” MySQLierror


unexplainable "Call to a member function bind_param() on a non-object" MySQLierror

我目前正在尝试使用MySQLi准备语句删除MySQL数据库中的某些行。对于初学者,这是我删除行的代码:

elseif ($this->loggedInAs(NORMAL_USER)) {
        $userID = $_SESSION['user_id'];
        $stmt = $this->con->prepare("SELECT messageID FROM messages WHERE messageID = ? AND (from_user = ? OR to_user = ?);");
        $stmt->bind_param("iii", $messageID, $userID, $userID);
        $stmt->execute();
        $stmt->bind_result($messageID_result);
        $stmt->fetch();

        if (is_numeric($messageID_result)) {
            $stmt = $this->con->prepare("DELETE FROM messagecomments WHERE messageID = ?");
            $stmt->bind_param("i", $messageID);
            $result = $stmt->execute();
            $stmt->close();
            if ($result) {
                $stmt = $this->con->prepare("DELETE FROM messagevotes
                                             WHERE messageID = ?");
                $stmt->bind_param("i", $messageID);
                $result = $stmt->execute();
                $stmt->close();
                if ($result) {
                    $stmt = $this->con->prepare("DELETE FROM messages
                                                 WHERE messageID = ?");
                    $stmt->bind_param("i", $messageID);
                    $result = $stmt->execute();
                    $stmt->close();
                    if($result) {
                        return true;
                    } else {
                        return false;   
                    }
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

以下错误消息中描述了它出错的部分:

Fatal error: Call to a member function bind_param() on a non-object in C:'...'DBClass.php on line 768

这是第二个 SQL 语句中的"$stmt->bind_param("i", $messageID);",我正在尝试从 messagecomments 中删除行。

错误消息通常发生在SQL语句中出现错误时,但是当我在MySQL工作台中运行它时,该语句运行良好。

(值得一提的是,我在同一类中做过类似的删除语句)

我真的看不出可能出了什么问题。如果有人能帮忙,我将不胜感激。

我认为

,您应该关闭第一条语句:

$stmt->bind_result($messageID_result);
$stmt->fetch();
$stmt->close();

关闭它后,第二个语句应该适合您。

显然,我在执行后没有关闭第一个语句。我以为我之前尝试过,没有任何运气。无论如何,通过添加

$stmt->close();

对于第一个声明,一切都解决了。

因此,如果其他人遇到同样的问题,请记住在完成陈述后始终关闭您的陈述。

对我来说,错误消息说您没有准备好的语句。如果出现问题,prepare 方法将返回 false,因此您应该检查一下。手册甚至给出了一个例子:

if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
   # ...
}

然后检查这个(手动):

mysqli_bind_param 此函数已从 PHP 5.3.0 起已弃用 并从 PHP 5.4.0 开始删除。

更新:这只是已弃用的函数,而不是 stmt 方法,抱歉。