Прямо сейчас ваш код отлично отслеживает успешный сценарий. Это означает, что у вас password_verify($password, $hash) === true
и while ($row = $x->fetch_assoc()) {
равны истине один раз.
Но для сценария, когда второе условие не выполнено $x->fetch_assoc() === false
, вы ничего не делаете. И php идет после вашего if ... else ...
заявления.
Чтобы избежать этого, предлагаю удалить строку else
. Это изменит поток кода, идущий сразу после if { ... }
, когда while
никогда не происходило.
}
// else {
echo "Wrong"; //Here I tried both echoing something or using html but none of them worked
?>
<div class="wrong">Username or password is invalid</div>
<?php
//}
Или, возможно, вы можете удалить петлю while
. Я не вижу, что вы используете $row
в любом месте.
//while ($row = $x->fetch_assoc()) {
$_SESSION['logged_in'] = true;
$_SESSION['username'] = $username;
?>
<div class="right">You are logged in!</div>
<script>
setTimeout(function () {
window.location.href = "admin/adminpanel.php";
}, 2000);
</script>
<?php
//}
ОБНОВЛЕНИЕ Ваш код должен выглядеть больше как
(Я предполагаю, что:
- вы используете mysqli
- имя пользователя уникально в этой таблице
- в столбце password
хранятся хэши паролей пользователей.
)
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $conn->prepare("SELECT `username`, `password` FROM users WHERE username= ?";
$stmt->bind_param('s', $username);
$stmt->bind_result($name, $hash);
if ($stmt->fetch()) {
if (password_verify($password, $hash)) {
$_SESSION['logged_in'] = true;
$_SESSION['username'] = $username;
?>
<div class="right">You are logged in!</div>
<script>
setTimeout(function () {
window.location.href = "admin/adminpanel.php";
}, 2000);
</script>
<?php
}
}
?>
<div class="wrong">Username or Password is invalid</div>
<?php
}