PHP - MySQLi准备语句

时间:2014-01-14 11:46:23

标签: php mysqli

$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'也是如此。你能建议一种解决这个问题的方法吗?

2 个答案:

答案 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