I'm trying to implement a login system, and it mostly works except for this PHP script that's been returning 0:
// $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);
This never works, as it gets stuck since it doesn't meet the condition mysqli_stmt_num_rows == 1, rather it returns a 0. It does work via MySQL directly through the Workbench:
SELECT rowid, username, password FROM admin_login WHERE username = "admin";
does return 1 row with the matching criteria.
** EDIT: Here's my new code; **
<?php
require_once "_php/login/config.php";
$username = $password = "";
$err = "";
if ($_SERVER['REQUEST_METHOD'] == "POST") {
    if (empty(trim($_POST["username"]))) {
        $err = "Enter a username";
    } else {
        $password = trim($_POST["password"]);
    }
    if (empty(trim($_POST["password"]))) {
        $err = "Enter a password";
    } else {
        $password = trim($_POST["password"]);
    }
    $stmt = $db->prepare("SELECT rowid, username, password FROM admin_login WHERE username = ?");
    $stmt->bind_param("s", $_POST["username"]);
    $stmt->execute();
    $stmt->store_result();
    $user = $stmt->get_result()->fetch_assoc();
    if ($user && password_verify($_POST["password"], $user["password"])) {
        session_start();
        $_SESSION["loggedin"] = true;
        $_SESSION["username"] = $username;
        header("location: index.php");
    } else {
        $err = "Wrong password";
    }
}
//end of program
And it throws:
Fatal error: Uncaught Error: Call to a member function fetch_assoc() on boolean in directory/login_script.php:25 Stack trace: #0 directory/login.php(2): require() #1 {main} thrown in directory/login_script.php on line 25
For reference, login_script is the PHP script, login is the frontend as php.
 
     
    