$name = $_GET['user'];
if(isset($_GET['user']) && strlen($_GET['user'])>0) {
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db);
$stmt = $mysqli->prepare("SELECT username FROM users WHERE username=?");
$stmt->bind_param('s', $name);
$stmt->execute();
while($stmt->fetch()) {
if($stmt->num_rows == 0) {
header("Location: home?errormsg=notfound");
exit();
}
}
$stmt->store_result();
$stmt->close();
}
$mysqli->close();
因此,上面的代码检查数据库中是否存在$ _GET ['name'],如果不存在,则重定向到home?errormsg = notfound但是它将数据库中存在的用户名重定向到链接'home?errormsg = notfound'也是如此。你能建议一种解决这个问题的方法吗?
答案 0 :(得分:3)
您必须在$stmt->store_result()
之前致电$stmt->num_rows
。
并且您的$stmt->fetch()
不是必需的,因为您不使用所选数据。
如果您在store_result()
之后致电num_rows
,则无效。
来自manual page的部分评论:
如果你不使用mysqli_stmt_store_result()和immediatley调用 执行准备好的语句后,此函数将执行此功能 通常返回0,因为它无法知道有多少行 结果集,因为结果集尚未保存在内存中。
所以您的代码应如下所示:
$name = $_GET['user'];
if(isset($_GET['user']) && strlen($_GET['user'])>0) {
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db);
$stmt = $mysqli->prepare("SELECT username FROM users WHERE username=?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows == 0) {
header("Location: home?errormsg=notfound");
exit();
}
$stmt->close();
}
$mysqli->close();
答案 1 :(得分:0)
我没试过这个但也许有帮助。
您在$stmt->store_result();
之后致电$stmt->num_rows
请尝试在$stmt->store_result();
$stmt->num_rows
实施例。你可以看到here