我目前正在尝试使用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 方法,抱歉。