为了账号安全,请及时绑定邮箱和手机立即绑定

PHP:mysqli_stmt_num_rows($stmt) 总是返回 0

PHP:mysqli_stmt_num_rows($stmt) 总是返回 0

PHP
芜湖不芜 2021-09-18 15:59:58
我正在尝试实现一个登录系统,除了这个返回 0 的 PHP 脚本外,它主要工作:// $username_err & $password_err is empty, gets reset every time as "".if(empty($username_err) && empty($password_err)){    $query = "SELECT rowid, username, password FROM admin_login WHERE username = ?";    if($stmt = mysqli_prepare($db, $query)){        mysqli_stmt_bind_param($stmt, "s", $param_username);        $param_username = $username;            if(mysqli_stmt_execute($stmt)){                mysqli_stmt_store_result($stmt);                // Doesn't work here, works up until here.                if(mysqli_stmt_num_rows($stmt) == 1){                    mysqli_stmt_bind_result($stmt, $rowid, $username, $hashed_password);                    if(mysqli_stmt_fetch($stmt)){                        if(password_verify($password, $hashed_password)){                        session_start();                        $_SESSION["loggedin"] = true;                        $_SESSION["id"] = $rowid;                        $_SESSION["username"] = $username;                        header("location: index.php");                        }else{                           $password_err = "Invalid password";                        }                    }                }else{                    $username_err = "No such account exists.";            }        }else{    echo "An error occurred.";    }  }mysqli_stmt_close($stmt);}mysqli_close($db);这永远不会奏效,因为它卡住了,因为它不满足条件 mysqli_stmt_num_rows == 1,而是返回 0。它确实通过 MySQL 直接通过 Workbench 工作:SELECT rowid, username, password FROM admin_login WHERE username = "admin";确实返回具有匹配条件的 1 行。** 编辑:这是我的新代码;**<?phprequire_once "_php/login/config.php";$username = $password = "";$err = "";它抛出:致命错误:未捕获错误:在目录/login_script.php:25 中的布尔值上调用成员函数 fetch_assoc()堆栈跟踪:#0目录/login.php(2): require() #1 {main} 抛出目录/第 25 行的 login_script.php作为参考,login_script 是PHP 脚本,login 是php 的前端。
查看完整描述

1 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

  1. 永远不需要那个无用的 num_rows 东西。您已经有来自 fetch() 的一行。在您有使用 num_rows 的想法的任何地方使用它。

  2. 当它为 0 时(或者更确切地说,唯一获取的行是假的),这意味着您的查询没有找到给定输入值和当前数据库内容的行。就如此容易。这是你的问题的答案。简单、直接、合乎逻辑。

  3. 也就是说,这段代码比它需要的要膨胀三倍。请参阅我为使用 mysqli 检查密码而编写的规范代码。验证您的输入值、数据库内容并检查错误 - 它将完美运行。


查看完整回答
反对 回复 2021-09-18
  • 1 回答
  • 0 关注
  • 382 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信