【问题标题】:PHP - MySQLi Prepared StatementsPHP - MySQLi 准备好的语句
【发布时间】:2014-01-14 11:46:22
【问题描述】:
$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' 也是如此。你能提出解决这个问题的方法吗?

【问题讨论】:

  • 为什么不使用 COUNT 语句检查是否存在? SELECT COUNT(*) AS uncnt FROM users WHERE username=?。它与选择用户名本身一样快(然后您基本上将其丢弃)并且在语义上更明确您正在尝试做什么。

标签: php mysqli


【解决方案1】:

你必须在$stmt->num_rows之前调用$stmt->store_result()

您的$stmt->fetch() 不是必需的,因为您不使用选定的数据。

如果您在num_rows 之后调用store_result(),它将不起作用。

来自manual page的部分评论:

如果你不使用mysqli_stmt_store_result(),并且立即调用 这个函数在执行一个准备好的语句后,这个函数将 通常返回 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();

【讨论】:

  • 非常感谢!它解决了我的问题。
【解决方案2】:

我没有尝试过,但也许有帮助。

你在$stmt->num_rows之后调用$stmt->store_result();
请尝试在$stmt->num_rows 之前移动$stmt->store_result();

示例。你可以看到here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多