Оповещение о неверном пароле - 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

→ Ссылка