首次尝试MySQLi准备语句

时间:2014-02-15 05:17:43

标签: php mysqli prepared-statement

我正在尝试将一些mysqli查询重新编写为预处理语句(我的第一次尝试)。前两个注释行是旧查询,工作得很好。剩下的就是我尝试写一份准备好的声明:

//$sql = "SELECT hashed_password FROM Administrators WHERE user_name='$username'";
//$result = mysqli_query($link, $sql);

//switch to prepared statement
$stmt = mysqli_stmt_init($link);
$result = false;
if (mysqli_stmt_prepare($stmt, 
    'SELECT hashed_password FROM Administrators WHERE user_name=?')) 
{

    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, "s", $username);

    /* execute query */
    $result = mysqli_stmt_execute($stmt);

    /* close statement */
    //mysqli_stmt_close($stmt);
}

if (!$result) {
    mysqli_close($link);
    die("Error running query " . mysqli_error($link));
}

if (mysqli_num_rows($result) == 0) {
        mysqli_close($link);
        echo "No such user";
        die();
    }

在最后一行显示错误,但显然会追溯到之前的一行。

有人可以告诉我我做错了什么吗?我直接从PHP文档中获取了这个,但显然我遗漏了一些东西。谢谢!

编辑:感谢有人指出我忘记从查询中分配返回值。我已将这些评论合并并修改了我的代码。但是,我仍然无法成功运行查询。现在我收到了这个错误:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /home/content/07/11347607/html/RevRunning/scripts/administration/login.php on line 53 No such user

相信我,我在UI中输入的用户确实存在,所以我的代码仍然存在问题。再次感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

为了测试查询是否失败,您需要从mysqli_stmt_execute获取返回布尔值,如下所示:

$result = mysqli_stmt_execute($stmt);
然后你就可以检查:

if (!$result) {
 // if you get here it mean $result is false
 //therefore it failed
}

答案 1 :(得分:0)

您收到此Couldn't fetch mysqli错误,因为您正在访问已关闭的对象。

正如你在这里看到的那样......

   /* close statement */
    mysqli_stmt_close($stmt);  //<-------- As you have closed it !!!!
}

if (!$result) {    //<------ But you are accessing it here !
    mysqli_close($link);
    die("Error running query " . mysqli_error($link));
}

答案 2 :(得分:0)

经过多次反复试验,看起来我遇到了一些问题。

首先,这是错误的:

/* execute query */
$result = mysqli_stmt_execute($stmt);

有一个命令可以将结果绑定到变量。正确的方法是:

/* execute query */
mysqli_stmt_execute($stmt);

/* Bind results to variable */
mysqli_stmt_bind_result($stmt, $result);

我的另一个问题是解释返回值(即$result中存储的内容)。当我使用非预处理语句时,返回值是我需要首先使用mysqli_fetch_array($result)解包的数据集。我可以使用mysqli_num_rows测试此数据集中的行数。至少在这种情况下,返回值只是一个字符串,但我仍然需要用mysqli_fetch_array打开它。

不是用准备好的陈述。现在返回值只是一个字符串,所以我需要做的就是测试我是否有回馈的东西是这样的:

if (!stmt) { // do before closing $stmt
    mysqli_close($link);
    echo "Query Error";
    die();
}

if (!$result) {
    mysqli_close($link);
    echo "No results returned";
    die();
}

这只是基于我自己的测试并找到了一个成功的解决方案。如果我说错了或者有人能给出更好的答案,请随时发表评论。

感谢大家的帮助。