我正在尝试实现一个登录系统,除了这个返回 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个赞
你永远不需要那个无用的 num_rows 东西。您已经有来自 fetch() 的一行。在您有使用 num_rows 的想法的任何地方使用它。
当它为 0 时(或者更确切地说,唯一获取的行是假的),这意味着您的查询没有找到给定输入值和当前数据库内容的行。就如此容易。这是你的问题的答案。简单、直接、合乎逻辑。
也就是说,这段代码比它需要的要膨胀三倍。请参阅我为使用 mysqli 检查密码而编写的规范代码。验证您的输入值、数据库内容并检查错误 - 它将完美运行。
- 1 回答
- 0 关注
- 382 浏览
添加回答
举报
0/150
提交
取消