为什么我的第一个PHP类没有按预期工作?

时间:2014-06-23 16:28:00

标签: php mysql class

我正在编写我的第一个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'行可能会以某种方式搞砸了,但是如何?

2 个答案:

答案 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
}