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

我正在尝试实现一个登录系统,除了这个返回 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 行。


** 编辑:这是我的新代码;**


<?php

require_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 的前端。


芜湖不芜
浏览 383回答 1
1回答

潇湘沐

你永远不需要那个无用的 num_rows 东西。您已经有来自 fetch() 的一行。在您有使用 num_rows 的想法的任何地方使用它。当它为 0 时(或者更确切地说,唯一获取的行是假的),这意味着您的查询没有找到给定输入值和当前数据库内容的行。就如此容易。这是你的问题的答案。简单、直接、合乎逻辑。也就是说,这段代码比它需要的要膨胀三倍。请参阅我为使用 mysqli 检查密码而编写的规范代码。验证您的输入值、数据库内容并检查错误 - 它将完美运行。
打开App,查看更多内容
随时随地看视频慕课网APP