Оповещение о неверном пароле - PHP
У менять есть формочка для ввода логина и пароля:
<div class="l-form">
<form action="services/auth.php" method="post" class="form">
<h1 class="form__title">Sign In</h1>
<div class="form__div">
<input type="text" name="login" class="form__input" placeholder=" ">
<label for="" class="form__label">Login</label>
</div>
<div class="form__div">
<input type="password" name="password" class="form__input" placeholder=" ">
<label for="" class="form__label">Password</label>
</div>
<input type="submit" class="form__button" value="Sign In">
<p class="account">Don't have an account? <a href="?register" class="account">Create one now</a></p>
</form>
</div>
и есть код в файле auth.php который проверяет данные которые ввел пользователь.
И в этойм файле есть следующая проверка:
if(mysqli_num_rows($result) == 0) {
echo "This user does not exist...";
exit();
}
То есть у меня все работает, но когда пользователь ввел что то не так, то его перекидает на
новую страницу и там пишет "This user does not exist...", так вот вопрос, можно ли как то
сделать так, что бы меня не перекидовало на новую страницу, а например около полей для ввода,
высветлилась надпись, я просто не знаю как мне достучатся к этой проверки с другого файла, там где
и находится эта хормочка, я пробовал в auth.php создавать переменню типа bool, и в проверке
менял ее значение, а в файое с формой проверял эту переменню на значение и хотел вывести текст,
но похоже что так сделать нельзя... Буду раз за любые подсказки
Ответы (1 шт):
Хороший вопрос, редко кто до него доходит. Обычно всех учеников устраивает вот это "user does not exist" в чистом поле.
Первое что тут надо понять, это что не "его перекидает", а у вас в форме написано, <form action="services/auth.php". Что в action написано, ту страницу браузер и запрашивает.
Поэтому чтобы не открывалась другая страница, надо просто указать в action ту же самую. А лучше вообще ничего не указывать - браузер и сам поймёт.
А чтобы отображать ошибки рядом с полями, обработку формы надо делать в самом начале, и записывать ошибки в переменные. Которые потом выводить в форме
<?php
if ($_POST) {
if ($_POST['email'] === '') {
$errors['email'] = "Email is required";
} elseif(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$errors['email'] = "Email is invalid";
}
if ($_POST['Password'] === '') {
$errors['password'] = "Password is required";
}
if (!$errors) {
$stmt = $conn->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $_POST['email']);
$stmt->execute();
$user = $stmt->get_result()->fetch_assoc();
if (!$user)
$errors['email'] = "This user does not exist";
} elseif(!password_verify($_POST['password'], $user['pass'])) {
$errors['email'] = "Incorrect password";
}
if (!$errors) {
// авторизуем и перекидываем куда-нибудь
$_SESSION['user'] = $user['id'];
header("Location: /profile.php");
exit;
}
}
}
?>
и вот только тут начинаем выводить весь HTML И в том числе форму
<div class="form__div">
<?php if isset($errors['login']): ?>
<div class="form__error">
<?= $errors['login'] ?>
</div>
<?php endif ?>
<input type="text" name="login" class="form__input" placeholder=" ">
<label for="" class="form__label">Login</label>
</div>
Таким образом эта страница будет выполнять три роли
- показывать форму авторизации
- проверять введенные данные и отображать ошибки, если они были
- авторизовывать и перенаправлять куда-то, если логин и пароль верные
этот принцип подходит для любых форм с методом POST