如何解决这个mysqli PHP警告?

时间:2014-12-04 06:56:59

标签: php mysql mysqli

我一直收到以下警告:

[04-Dec-2014 06:51:49 UTC] PHP Warning:  mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given in xxx.php on line 48
[04-Dec-2014 06:51:49 UTC] PHP Warning:  mysqli_stmt_execute() expects parameter 1 to be mysqli_stmt, boolean given in xxx.php on line 49
[04-Dec-2014 06:51:49 UTC] PHP Warning:  mysqli_stmt_close() expects parameter 1 to be mysqli_stmt, boolean given in xxx.php on line 50

在我的(有限)经验中,这意味着我输入的MYSQL查询是错误的。但是,我检查了我的代码 - 它有效,但有时会抛出此错误。到底是怎么回事?相关代码如下。

            $stmt = mysqli_prepare($con, "UPDATE xxx SET yyy = ?, zzz = ?, timecheck = NOW(), aaa = ? WHERE bbb = '$ccc'");
            mysqli_stmt_bind_param($stmt, "dss", $abc, $def, $ghi);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_close($stmt);

$ abc是一个浮点数,$ def是NULL,$ ghi是一个字符串。问题可能是$ ccc有时候没有保留应有的价值吗?

请帮助!

2 个答案:

答案 0 :(得分:1)

按照定义行

$stmt = mysqli_prepare($con, "UPDATE xxx SET yyy = ?, zzz = ?, timecheck = NOW(), aaa = ? WHERE bbb = '$ccc'");

在错误情况下可以返回false(请参阅此处的定义http://php.net/manual/de/mysqli.prepare.php

您的代码不考虑这种情况。 由于你所有其他使用的mysqli函数都需要一个mysqli_stmt对象,你会得到这些错误。

你应该使用这样的代码:

$con = mysqli_connect("host", "user", "pw", "database");

/* check connection */
if (mysqli_connect_errno())
{
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

if ($stmt = mysqli_prepare($con, "UPDATE xxx SET yyy = ?, zzz = ?, timecheck = NOW(), aaa = ? WHERE bbb = '$ccc'"))
{
    mysqli_stmt_bind_param($stmt, "dss", $abc, $def, $ghi);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
}

mysqli_close($con);

答案 1 :(得分:0)

mysqli_prepare()返回一个语句对象,如果发生错误则返回FALSE。检查$ stmt是否被赋值为false。