PHP - MySQLi 准备好的语句

标签 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' 也是如此。您能提出解决这个问题的方法吗?

最佳答案

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

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

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

来自manual page的部分评论:

If you do not use mysqli_stmt_store_result( ), and immediatley call this function after executing a prepared statement, this function will usually return 0 as it has no way to know how many rows are in the result set as the result set is not saved in memory yet.

因此您的代码应如下所示:

$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();

关于PHP - MySQLi 准备好的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21112774/

相关文章:

php - bind_param 与 array$i php 数据库

javascript - 根据下拉选项更改多个输入字段的值(js 或 PHP 开关)

php - 按用户评论过滤 - SQL 参数数量必须在 0 到 65535 之间

PHP preg_match 查找整个单词

PHP 破坏了我的代码

php - 需要 SQL 速记 - PHP PDO

php - 使用 RegEX 解析 CSS 文件

php - 在 Laravel/Homestead 中映射文件夹和站点

php - 转移到新服务器,现在 CodeIgniter/Ion_Auth 无法工作

php - Mysql用同一表中的另一行值更新一行