我正在尝试将一些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中输入的用户确实存在,所以我的代码仍然存在问题。再次感谢您的帮助。
答案 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();
}
这只是基于我自己的测试并找到了一个成功的解决方案。如果我说错了或者有人能给出更好的答案,请随时发表评论。
感谢大家的帮助。