У вас есть этот запрос:
"SELECT id, email, pin FROM users WHERE email = ?"
Вы проверяете правильность адреса электронной почты. Вы можете изменить его на
"SELECT id, email, pin FROM users WHERE email = ? and pin = ?"
, конечно же, передавая пин-код. Кроме того, ваше сообщение об ошибке вводит в заблуждение:
if($stmt->num_rows == 1){
// Password is correct, so start a new session
session_start();
// Store data in session variables
$_SESSION["loggedin"] = true;
$_SESSION["id"] = $id;
$_SESSION["email"] = $email;
// Redirect user to welcome page
header("location: dashboard.php");
} else{
// Display an error message if password is not valid
$numerpin_err = "The password you entered was not valid.";
}
что делать, если существует несколько записей с одним и тем же адресом электронной почты? В этом случае он скажет, что пароль неверный, без проверки его действительного значения. Было бы гораздо надежнее получить записи по электронной почте и пин-код, зациклить результаты и, когда совпадение найдено, затем создать сеанс. Если совпадений нет, то ошибка.