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.