我正在编写我的第一个PHP课程,试着学习OO概念。此代码的目标是将用户的IP和相关参数记录到数据库中,以后我可能将其用作应用临时禁令的基础。 (不,我们不讨论该策略的优点 - 让我们继续编写类!)。这就是我所拥有的:
class banAss {
public function __construct(mysqli $db){
$this->db = $db;
$this->visitip = $_SERVER['REMOTE_ADDR'];
$this->visitAgent = $_SERVER['HTTP_USER_AGENT'];
$this->visitDate = time();
}
public function addBan(){
$sql = "Insert into banned (visitIP, visitAgent, visitDate,) values (?, ?, ?)";
$stmt = mysqli_prepare($this->db, $sql);
mysqli_stmt_bind_param($stmt, "ssi", $this->visitip, $this->visitAgent, $this->visitDate);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
}
}
$banned = new banAss($db);
$banned->addBan();
值得注意的是,我确实有一个使用mysqli打开的有效数据库连接。我一直在玩whackamole,上面有错误消息。目前他们站在:
Warning: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given in /home/c9/public_html/admin/login.php on line 16
Warning: mysqli_stmt_execute() expects parameter 1 to be mysqli_stmt, boolean given in /home/c9/public_html/admin/login.php on line 17
Warning: mysqli_stmt_close() expects parameter 1 to be mysqli_stmt, boolean given in /home/c9/public_html/admin/login.php on line 18
我不明白这些消息。他们建议创建变量$ stmt的'mysqli_prepare'行可能会以某种方式搞砸了,但是如何?
答案 0 :(得分:2)
警告:mysqli_stmt_bind_param()要求参数1为mysqli_stmt,在...中给出布尔值
仔细阅读:它告诉你当函数不期望它时,你传入一个布尔值。 mysqli_prepare()
在遇到错误时返回布尔值FALSE
,这就是您尝试传递给mpsqli_stmt_bind_param()
函数的内容,因此 会产生错误和一个布尔FALSE
值,只是涓涓细流。
使用mysqli_error()
来获取您获得的确切错误,并可能对如何修复错误提供一些了解。
答案 1 :(得分:2)
您的查询语法错误,这意味着所有准备和后续调用都失败:
$sql = "Insert into banned (visitIP, visitAgent, visitDate,) etc...
^---dangling comma
永远不要认为数据库操作已经成功。您需要检查失败,在您的情况下,返回值为boolean FALSE:
$stmt = mysqli_prepare(....);
if ($stmt === false) {
... oops something blew up
}