我试图从我的数据库中选择一些东西,并对它们进行呼应。由于某些原因,我唯一能呼应的是电子邮件。id和用户名没有显示出来。我没有得到任何错误,他们只是没有出现。
$sql = "SELECT id, email, username FROM users WHERE email = ?";
if ($stmt = mysqli_prepare($link, $sql)) {
mysqli_stmt_bind_param($stmt, "s", $param_email);
$param_email = $email;
if (mysqli_stmt_execute($stmt)) {
mysqli_stmt_store_result($stmt);
if (mysqli_stmt_num_rows($stmt) == 1) {
mysqli_stmt_bind_result($stmt, $id, $email, $username);
$error = 0;
$to = $email;
echo "id:".$id;
echo $username;
echo $email;
} else {
//some stuff
}
} else {
$error = 1;
}
}
我错过了什么?
为什么你看不到从数据库中获取的任何值,是因为你忘记了调用 fetch()
之后 bind_result()
.
但是,你把事情搞得太复杂了。你不需要这么多 if
语句,你不应该使用 bind_result()
如果你有多个列。这将变得非常混乱。使用 get_result()
来获取结果,然后获取你所需要的单条记录(假设电子邮件是唯一的,并且你的SELECT返回0或1条记录)。
$stmt = $link->prepare("SELECT id, email, username FROM users WHERE email = ?");
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result()->fetch_assoc();
if ($result) {
$error = 0;
$to = $result['email'];
echo "id:".$result['id'];
echo $result['username'];
echo $result['email'];
} else {
$error = 1;
}
没有必要使用 mysqli_stmt_num_rows
. 数据本身会告诉你是否有东西被返回。这也保护了你在使用非缓冲查询时不会出现类似的问题。很容易不小心漏掉 mysqli_stmt_store_result()
.
永远不要检查 mysqli_stmt_execute()
或 mysqli_prepare()
. 这是一个可怕的和混乱的做法。确保你已经开启了错误报告功能。请看 如何在MySQLi中获取错误信息?