Подтверждение адреса электронной почты

Подтверждение email

Приветствую! Как и обещал, в этой статье мы добавим функционал подтверждения почты к форме регистрации, которую создали в статье " Создание формы регистрации и авторизации ". Архив с файлами сайта, которого создали в прошлой статье, Вы можете скачать по этой ссылке.

И так, погнали! Для начала, изменим немножко саму форму регистрации. Регистрируясь в различные сайты, Вы наверняка заметили что, у многих форм регистрации, присутствует поле для ввода повторного пароля . Данное поле добавляется для того чтобы подтвердить вводимый пароль. Так вот, у нашей формы регистрации мы также добавим это поле "повторите пароль".

Замечание! После скачивания архива, не забудьте поменять данные для подключения к базе данных и указать адрес Вашего сайта. Всё это нужно сделать в файле dbconnect.php.

Добавляем поле "повторите пароль" у формы регистрации

Для того чтобы добавить это поле, открываем файл form_register.php с формой регистрации, и сразу после ряда таблицы с полем для ввода пароля, добавляем поле "повторите пароль".

        
        <tr>
            <td> Повторите пароль: </td>
            <td>
                <input type="password" name="confirm_password" placeholder="минимум 6 символов" required="required" /><br />
                <span id="valid_confirm_password_message" class="mesage_error"></span>
            </td>
        </tr>
    

Теперь, с помощью JavaScript мы должны проверить, совпадают ли пароли из этих полей. Если они не совпадают, то дезактивируем кнопку регистрации и выведем сообщение о том, что пароли не совпадают, иначе, если пароли совпадают, то убираем это сообщение об ошибке и активируем кнопку регистрации.

Сейчас, код JavaScript, у нас находится в файле header.php. Он действителен как для формы регистрации, так и для формы авторизации. Но, это не совсем правильно, так как это две разные формы. И при написании кода проверки для формы регистрации, возникнут проблемы с проверкой формы авторизации и наоборот.

Поэтому вырезаем этот код из файла header.php, вместе с тегами script и вставляем его в файле form_register.php, до блока для вывода сообщений. Код подключения библиотеки jQuery оставляем в файле header.php.

Теперь, открываем файл form_auth.php и добавляем этот же код, вместе с тегами script, также до блока для вывода сообщений.

Сохраняем изменения во всех затронутых файлах, возвращаемся к файлу form_register.php и приступаем к изменению JavaScript кода.

Значит, код, где проверяется email, мы не трогаем, изменения производим в коде, который находится ниже строчки с комментарием Проверка паролей. После строчки, где объявляем переменную password, объявляем ещё одну переменную confirm_password.

        //================ Прооверка паролей ==================
        var password = $('input[name=password]');
        var confirm_password = $('input[name=confirm_password]');
    

Теперь, производим изменения внутри функции, обработки события blur, для поля password. Заменяем старое содержимое на это:

        
        password.blur(function(){
            if(password.val() != ''){

                //Если длина введённого пароля меньше шести символов, то выводим сообщение об ошибке
                if(password.val().length < 6){
                    //Выводим сообщение об ошибке
                    $('#valid_password_message').text('Минимальная длина пароля 6 символов');

                    //проверяем, если пароли не совпадают, то выводим сообщение об ошибке
                    if(password.val() !== confirm_password.val()){
                        //Выводим сообщение об ошибке
                        $('#valid_confirm_password_message').text('Пароли не совпадают');
                    }

                    // Дезактивируем кнопку отправки
                    $('input[type=submit]').attr('disabled', true);
                    
                }else{
                    //Иначе, если длина первого пароля больше шести символов, то мы также проверяем, если они  совпадают. 
                    if(password.val() !== confirm_password.val()){
                        //Выводим сообщение об ошибке
                        $('#valid_confirm_password_message').text('Пароли не совпадают');

                        // Дезактивируем кнопку отправки
                        $('input[type=submit]').attr('disabled', true);
                    }else{
                        // Убираем сообщение об ошибке у поля для ввода повторного пароля
                        $('#valid_confirm_password_message').text('');

                        //Активируем кнопку отправки
                        $('input[type=submit]').attr('disabled', false);
                    }

                    // Убираем сообщение об ошибке у поля для ввода пароля
                    $('#valid_password_message').text('');
                }

            }else{
                $('#valid_password_message').text('Введите пароль');
            }
        });

    

Это были изменения для проверки поля, где вводится первый пароль. Здесь мы проверили такие случаи:

Если первый пароль имеет длину меньше шести символов, и он не совпадает с паролем из поля подтверждения пароля, то мы выводи оба сообщения: "Минимальная длина пароля 6 символов" и "Пароли не совпадают".

Длина паролей меньше шести символов и они не совпадают

В случае, если первый пароль имеет длину меньше шести символов, и он совпадает с паролем из поля подтверждения пароля, мы выводим сообщение об ошибке только для первого поля: " Минимальная длина пароля 6 символов "

Длина паролей меньше шести символов и они совпадают

Когда длина первого пароля больше 6 символов, но он не совпадает со вторым паролем, то мы выводим сообщение только для второго поля: " Пароли не совпадают "

Первый пароль имеет длину больше шести символов, но он не совпадает со вторым паролем

Но, также необходимо проверить совпадают ли пароли, после ввода второго пароля. То есть, когда поле для подтверждения пароля теряет фокус, мы должны проверить совпадает ли второй пароль с первым паролем.

В коде, который представлен выше, в указанное место " //(1) — Место для следующего куска кода " добавляем следующий кусок кода:

        confirm_password.blur(function(){
            //Если пароли не совпадают
            if(password.val() !== confirm_password.val()){
                //Выводим сообщение об ошибке
                $('#valid_confirm_password_message').text('Пароли не совпадают');

                // Дезактивируем кнопку отправки
                $('input[type=submit]').attr('disabled', true);
            }else{
                //Иначе, проверяем длину пароля
                if(password.val().length > 6){

                    // Убираем сообщение об ошибке у поля для ввода пароля
                    $('#valid_password_message').text('');

                    //Активируем кнопку отправки
                    $('input[type=submit]').attr('disabled', false);
                }

                // Убираем сообщение об ошибке у поля для ввода повторного пароля
                $('#valid_confirm_password_message').text('');
            }

        });
    

Проверка паролей на совпадение на стороне сервера

Выше, мы сделали проверку, совпадает ли пароль из поля password с паролем из поля confirm_password на языке JavaScript, используя библиотеку jQuery. Но мы должны сделать эту же проверку и на стороне сервера, вдруг пользователь отключил JavaScript в своём браузере.

В файле register.php после строчки, где обрезаем пробелы пароля в массиве POST.

        //Обрезаем пробелы с начала и с конца строки
        $password = trim($_POST["password"]);
    

Добавляем код, где проверяем, совпадают ли пароли.

        //Проверяем, совпадают ли пароли
        if(isset($_POST["confirm_password"])){
            //Обрезаем пробелы с начала и с конца строки
            $confirm_password = trim($_POST["confirm_password"]);

            if($confirm_password != $password){
                // Сохраняем в сессию сообщение об ошибке. 
                $_SESSION["error_messages"] .= "<p class='mesage_error' >Пароли не совпадают</p>";
                
                //Возвращаем пользователя на страницу регистрации
                header("HTTP/1.1 301 Moved Permanently");
                header("Location: ".$address_site."form_register.php");

                //Останавливаем  скрипт
                exit();
            }

        }else{
            // Сохраняем в сессию сообщение об ошибке. 
            $_SESSION["error_messages"] .= "<p class='mesage_error' >Отсутствует поле для повторения пароля</p>";
            
            //Возвращаем пользователя на страницу регистрации
            header("HTTP/1.1 301 Moved Permanently");
            header("Location: ".$address_site."form_register.php");

            //Останавливаем  скрипт
            exit();
        }
    

Всё. С проверкой паролей на стороне сервера, мы также закончили. Идём дальше.

Подготовка базы данных

Замечание! Функционал подтверждения почты я делал на реальном сайте, так как на хостинге уже настроен функционал отправки почты и функция mail() работает без проблем. Если у Вас сайт на локальном хостинге, то, чтобы всё работало, нужно настроить сервер. Если вы пользуйтесь пакетом Denwer, то, отправленные письма будут сохраняться в папке tmp/!sendmail.

Для начала, в форму регистрации, необходимо добавить заметку о том, что пользователь должен ввести действующий email, так как на нём мы вышлем сообщение со ссылкой, для подтверждения почты.

Для этого открываем файл form_register.php и сразу после тега input для ввода email, добавляем сообщение, внутри тега p.

И ещё, у тега input добавляем атрибут maxlength со значением 100. С помощью этого атрибута мы устанавливаем максимальное количество символов для ввода.

В общем, код у нас получился таким:

        <tr>
            <td> Email: </td>
            <td>
                
                <input type="email" name="email" maxlength="100" required="required" />
                <p class="note_text">Укажите правильный Email, так как на нём будет выслано сообщение для подтверждения почты.</p>
                <span id="valid_email_message" class="mesage_error"></span>
            </td>
        </tr>
    

Для оформления сообщения из абзаца, мы добавили тегу p, класс note_text. Стили этого класса находятся в файле css/styles.css.

        .note_text{
            color: #667;
            font-size: 12px;
        }
    

Теперь переходим к разработке самого функционала подтверждения почты.

И начнём мы с базы данных. Как Вы помните из прошлой статьи, в базу данных, мы создали таблицу users, для хранения пользователей. У этой таблицы мы добавили поле email для сохранения почтового адреса пользователя и поле email_status, для указания, подтверждена ли почта у этого пользователя или нет. Если почта подтверждена, то поле email_status будет иметь значение 1, иначе, значение 0.

Поле для хранения статуса почты

Но этого не достаточно. Нам необходимо создать ещё одну таблицу, для временного хранения данных пользователей, которые ещё не подтвердили свою почту. Как создать таблицу я объяснил в статье Создание базы данных mysql в phpmyadmin. Эта таблица будет иметь такие поля: id, email, token и date_registrtion. И назовём мы эту таблицу confirm_users.

Поля таблицы confirm_users

Поле token предназначена для хранения уникального кода, для каждого пользователя. Этот код мы поставим в ссылке из письма, которую отправим пользователю на почту.

Когда пользователь нажмёт на ссылку из письма, он перейдёт обратно на наш сайт, где мы будем проверять, равен ли код из ссылки, с кодом который хранится в поле token. И если они равны, то мы удалим данные пользователя из таблицы confirm_users, а в таблицу users изменим значение поля email_status с 0 на 1.

С таблицами из базы данных мы разобрались, приступаем к программированию функционала подтверждения почты.

Отправление письма для подтверждения почты

В предыдущей статье в случаи успешной регистрации, мы просто перенаправляли пользователя на страницу авторизации с сообщением о том что " Регистрация прошла успешно!!! ".

Теперь же, в случаи успешной регистрации, то есть после успешного добавления пользователя в таблицу users, необходимо составить уникальный token, и вместе с адресом электронной почты и датой регистрации добавить пользователя в таблицу confirm_users.

Поэтому в нашем файле register.php, удаляем код, который находится в блоке else. Вот этот:

        $_SESSION["success_messages"] = "<p class='success_message'>Регистрация прошла успешно!!! <br />Теперь Вы можете авторизоваться используя Ваш логин и пароль.</p>";

        //Отправляем пользователя на страницу авторизации
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: ".$address_site."/form_auth.php");
    

И вместо него пишем вот этот код:


        //Составляем зашифрованный и уникальный token
        $token=md5($email.time());

        //Добавляем данные в таблицу confirm_users
        $query_insert_confirm = $mysqli->query("INSERT INTO `confirm_users` (email, token, date_registration) VALUES ('".$email."', '".$token."', NOW()) ");

        if(!$query_insert_confirm){
            // Сохраняем в сессию сообщение об ошибке. 
            $_SESSION["error_messages"] .= "<p class='mesage_error' >Ошибка запроса на добавления пользователя в БД (confirm)</p>";
            
            //Возвращаем пользователя на страницу регистрации
            header("HTTP/1.1 301 Moved Permanently");
            header("Location: ".$address_site."form_register.php");

            //Останавливаем  скрипт
            exit();
        }else{

            //Составляем заголовок письма
            $subject = "Подтверждение почты на сайте ".$_SERVER['HTTP_HOST'];

            //Устанавливаем кодировку заголовка письма и кодируем его
            $subject = "=?utf-8?B?".base64_encode($subject)."?=";

            //Составляем тело сообщения
            $message = 'Здравствуйте! <br/> <br/> Сегодня '.date("d.m.Y", time()).', неким пользователем была произведена регистрация на сайте <a href="'.$address_site.'">'.$_SERVER['HTTP_HOST'].'</a> используя Ваш email. Если это были Вы, то, пожалуйста, подтвердите адрес вашей электронной почты, перейдя по этой ссылке: <a href="'.$address_site.'activation.php?token='.$token.'&email='.$email.'">'.$address_site.'activation/'.$token.'</a> <br/> <br/> В противном случае, если это были не Вы, то, просто игнорируйте это письмо. <br/> <br/> <strong>Внимание!</strong> Ссылка действительна 24 часа. После чего Ваш аккаунт будет удален из базы.';
            
            //Составляем дополнительные заголовки для почтового сервиса mail.ru
            //Переменная $email_admin, объявлена в файле dbconnect.php
            $headers = "FROM: $email_admin\r\nReply-to: $email_admin\r\nContent-type: text/html; charset=utf-8\r\n";
            
            //Отправляем сообщение с ссылкой для подтверждения регистрации на указанную почту и проверяем отправлена ли она успешно или нет. 
            if(mail($email, $subject, $message, $headers)){
                $_SESSION["success_messages"] = "<h4 class='success_message'><strong>Регистрация прошла успешно!!!</strong></h4><p class='success_message'> Теперь необходимо подтвердить введенный адрес электронной почты. Для этого, перейдите по ссылке указанную в сообщение, которую получили на почту ".$email." </p>";

                //Отправляем пользователя на страницу регистрации и убираем форму регистрации
                header("HTTP/1.1 301 Moved Permanently");
                header("Location: ".$address_site."form_register.php?hidden_form=1");
                exit();

            }else{
                $_SESSION["error_messages"] .= "<p class='mesage_error' >Ошибка при отправлении письма с сылкой подтверждения, на почту ".$email." </p>";
            }

            // Завершение запроса добавления пользователя в таблицу users
            $result_query_insert->close();

            // Завершение запроса добавления пользователя в таблицу confirm_users
            $query_insert_confirm->close();
        }
    

После того как мы добавили данные в таблицу confirm_users, мы проверяем если вдруг произошла ошибка в запросе, то мы добавляем в сессию сообщение об этой ошибке, иначе отправляем пользователю на указанную почту письмо, со ссылкой, для подтверждения почты. А на сайте выводим сообщение о том, что регистрация прошла успешно и необходимо подтвердить введённый адрес электронной почты.

Теперь, чтобы не было путаницы, необходимо удалить эти строчки, которые находятся сразу после блока else:

        /* Завершение запроса */
        $result_query_insert->close();

        //Закрываем подключение к БД
        $mysqli->close();
    

И вместо них записать вот эти:

        //Закрываем подключение к БД
        $mysqli->close();

        //Отправляем пользователя на страницу регистрации
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: ".$address_site."form_register.php");

        exit();
    

То есть, теперь функция завершение запроса на добавления пользователя в таблицу users ( $result_query_insert->close() ) , находится внутри блока else, а не за этим блоком, как было раньше.

Дальше, обратите внимание, что в случае успешной отправки письма, в ссылку перенаправления пользователя обратно на страницу регистрации, мы добавили параметр hidden_form.

        //Отправляем пользователя на страницу регистрации и убираем форму регистрации
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: ".$address_site."form_register.php?hidden_form=1");
        exit();
    

Параметр hidden_form нужен для того чтобы мы смогли спрятать форму регистрации после успешной отправки сообщения для подтверждения почты. Нам не нужно чтобы этот же пользователь смог зарегистрироваться заново.

Теперь, для того чтобы спрятать эту форму регистрации, мы должны изменить условия её отображения. Открываем файл form_register.php и внутри этого условия:

        if((!isset($_SESSION["email"]) && !isset($_SESSION["password"]))) {
    

Добавляем ещё одно условие, таким вот образом:

        <?php 
            //Проверяем, если пользователь не авторизован, то выводим форму регистрации, 
            //иначе выводим сообщение о том, что он уже зарегистрирован
            if((!isset($_SESSION["email"]) && !isset($_SESSION["password"]))) {

                if(!isset($_GET["hidden_form"])){
        ?>
                    
        <?php
                }//закрываем условие hidden_form

            }else{
                //Иначе, если пользователь уже авторизирован, то выводим этот блок
        ?>
                

Вы уже зарегистрированы

<?php } //Подключение подвала require_once("footer.php"); ?>

Теперь, в случае успешной регистрации мы увидим только это сообщение:

Регистрация прошла успешно

Хорошо, с добавлением пользователя в таблицу confirm_users, отправлением письма на почту и выводом сообщения об успешной регистрации мы закончили.

Переход по ссылки из письма для подтверждения почты

Замечание! Перед тем как продолжить, убедитесь в том, что при регистрации указали правильный почтовый ящик. Иначе Вы не получите письмо.

Настало время проверить, если письмо отправляется без проблем. Открываем в браузер страницу регистрации, вводим данные и нажимаем на кнопку зарегистрироваться.

Теперь, открываем наш почтовый ящик и видим, что нам пришло письмо с темой " Подтверждение почты на сайте develop.sozdatisite.ru ".

письмо для подтверждения почты

Открываем это письмо и видим ссылку для подтверждения почты.

содержимое письма для подтверждения почты

Обратите внимание на адрес ссылки. Когда мы составляли тело этого письма, мы указали ссылку подтверждения таким образом:

        <a href="'.$address_site.'activation.php?token='.$token.'&email='.$email.'">'.$address_site.'activation/'.$token.'</a>
    

И видим что, после нажатия на эту ссылку, мы перейдём в файл activation.php, в котором мы должны закончить с подтверждением. То есть, в этом файле необходимо, удалить пользователя который подтвердил свою почту, из таблицы confirm_users, а в таблице users, поменять статус почты с 0 на 1.

Как видим ссылка из письма, содержит два параметра, токен и email. Поэтому, перейдя по этой ссылке, мы должны сначала проверить, существуют ли у неё эти параметры.

Создаём этот файл activation.php, открываем его и пишем этот код:


        <?php 


        //Добавляем файл подключения к БД

        require_once("dbconnect.php");


        //Проверяем, если существует переменная token в глобальном массиве GET

        if(isset($_GET['token']) && !empty($_GET['token'])){

            $token = $_GET['token'];

        }else{

            exit("<p><strong>Ошибка!</strong> Отсутствует проверочный код.</p>");

        }



        //Проверяем, если существует переменная email в глобальном массиве GET

        if(isset($_GET['email']) && !empty($_GET['email'])){

            $email = $_GET['email'];

        }else{

            exit("<p><strong>Ошибка!</strong> Отсутствует адрес электронной почты.</p>");

        }

    

Если эти параметры существуют, то идём дальше. А дальше мы должны проверить, совпадает ли токен из ссылки с токеном из таблицы confirm_users.

Поэтому мы должны сделать запрос к этой таблице confirm_users, и выбрать значение поля token у соответствующего пользователя.

        //Делаем запрос на выборке токена из таблицы confirm_users
        $query_select_user = $mysqli->query("SELECT `token` FROM `confirm_users` WHERE `email` = '".$email."'");

        //Если ошибок в запросе нет
        if(($row = $query_select_user->fetch_assoc()) != false){


            //Если такой пользователь существует
            if($query_select_user->num_rows == 1){

                //Проверяем совпадает ли token
                if($token == $row['token']){

                    //(1) Место для следующего куска кода

                }else{ //if($token == $row['token'])
                    exit("<p><strong>Ошибка!</strong> Неправильный проверочный код.</p>");
                }

            }else{ //if($query_select_user->num_rows == 1)
                exit("<p><strong>Ошибка!</strong> Такой пользователь не зарегистрирован </p>");
            }

        }else{ //if(($row = $query_select_user->fetch_assoc()) != false)
            //Иначе, если есть ошибки в запросе к БД
            exit("<p><strong>Ошибка!</strong> Сбой при выборе пользователя из БД. </p>");
        }


        // Завершение запроса выбора пользователя из таблицы users
        $query_select_user->close();

        //Закрываем подключение к БД
        $mysqli->close();

        ?>
    

Если ошибок в запросе к базе нет, пользователь с такими данными существует и токены совпадают, то идём дальше. Иначе, останавливаем скрипт и выводим сообщение о соответствующей ошибке. Да, и в конце файла, завершаем запрос на выборку пользователя и закрываем подключение к базе.

Дальше мы должны обновить статус у поля email_status из таблицы users и удалить временные данные пользователя из таблицы confirm_users.

В указанное место " //(1) Место для следующего куска кода ", пишем следующий код:

        //Обновляем статус почтового адреса 
        $query_update_user = $mysqli->query("UPDATE `users` SET `email_status` = 1 WHERE `email` = '".$email."'");

        if(!$query_update_user){

            exit("<p><strong>Ошибка!</strong> Сбой при обновлении статуса пользователя. Код ошибки: ".$mysqli->errno."</p>");

        }else{

            //Удаляем данные пользователя из временной таблицы confirm_users
            $query_delete = $mysqli->query("DELETE FROM `confirm_users` WHERE `email` = '".$email."'");

            if(!$query_delete){

                exit("<p><strong>Ошибка!</strong> Сбой при удалении данных пользователя из временной таблицы. Код ошибки: ".$mysqli->errno."</p>");

            }else{

                //Подключение шапки
                require_once("header.php");

                    //Выводим сообщение о том, что почта успешно подтверждена.
                    echo '<h1 class="success_message text_center">Почта успешно подтверждена!</h1>';
                    echo '<p class="text_center">Теперь Вы можете войти в свой аккаунт.</p>';

                //Подключение подвала
                require_once("footer.php");
            }

            // Завершение запроса удаления данных из таблицы confirm_users
            $query_delete->close();
        }

        // Завершение запроса обновления статуса почтового адреса
        $query_update_user->close();
    

Если всё прошло успешно, то подключаем шапку и подвал сайта, и выводим радостное сообщение о том, что почта успешно подтверждена.

Почта успешно подтверждена

При авторизации проверяем, подтверждена ли почта

Теперь, при авторизации, мы должны проверить подтверждена ли почта. Если почта подтверждена, то пользователь войдёт в свой аккаунт, иначе, он увидит сообщение о том, что почта не подтверждена.

Открываем файл auth.php и изменяем его. После того как проверили, если зарегистрирован в базе пользователь с полученным почтовым адресом и паролем, то есть после этой строчки:

        //Проверяем, если в базе нет пользователя с такими данными, то выводим сообщение об ошибке
        if($result_query_select->num_rows == 1){
    

И перед тем как добавить email и пароль в сессию, то есть перед этими строчками:

        // Если введенные данные совпадают с данными из базы, то сохраняем логин и пароль в массив сессий.
        $_SESSION['email'] = $email;
        $_SESSION['password'] = $password;

        //Возвращаем пользователя на главную страницу
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: ".$address_site."/index.php");

    

Добавляем код для проверки, подтверждена ли почта или нет. Если почта не подтверждена, то выводим сообщение об ошибке, иначе, добавляем email и пароль в сессию.

В общем, код, у нас должен получиться таким:

        //Проверяем, если в базе нет пользователя с такими данными, то выводим сообщение об ошибке
        if($result_query_select->num_rows == 1){
            
            //Проверяем, подтвержден ли указанный email
            while(($row = $result_query_select->fetch_assoc()) !=false){
                
                //Если email не подтверждён
                if((int)$row["email_status"] == 0){

                    // Сохраняем в сессию сообщение об ошибке. 
                    $_SESSION["error_messages"] = "<p class='mesage_error' >Вы зарегистрированы, но, Ваш почтовый адрес не подтверждён. Для подтверждения почты перейдите по ссылке из письма, которую получили после регистрации.</p>
                        <p><strong>Внимание!</strong> Ссылка для подтверждения почты, действительна 24 часа с момента регистрации. Если Вы не подтвердите Ваш email в течении этого времени, то Ваш аккаунт будет удалён.</p>";

                    
                    //Возвращаем пользователя на страницу авторизации
                    header("HTTP/1.1 301 Moved Permanently");
                    header("Location: ".$address_site."form_auth.php");

                    //Останавливаем скрипт
                    exit();

                }else{
                    //место для добавления данных в сессию
                    // Если введенные данные совпадают с данными из базы, то сохраняем логин и пароль в массив сессий.
                    $_SESSION['email'] = $email;
                    $_SESSION['password'] = $password;

                    //Возвращаем пользователя на главную страницу
                    header("HTTP/1.1 301 Moved Permanently");
                    header("Location: ".$address_site."index.php");

                    //Останавливаем скрипт
                    exit();
                }

            }

        }else{
            
            // Сохраняем в сессию сообщение об ошибке. 
            $_SESSION["error_messages"] .= "<p class='mesage_error' >Неправильный логин и/или пароль</p>";
            
            //Возвращаем пользователя на страницу авторизации
            header("HTTP/1.1 301 Moved Permanently");
            header("Location: ".$address_site."form_auth.php");

            //Останавливаем скрипт
            exit();
        }
    

Обратите внимание, что мы вырезали строки добавления данных в сессию и перенаправления пользователя на главную страницу и добавили их в блоке else, проверки статуса email.

        //Если email не подтверждён
        if((int)$row["email_status"] == 0){

        }else{

            //место для добавления данных в сессию
        
        }
    

Переходим в браузер на страницу с формой авторизации и проверяем. Попробуем авторизоваться с не подтверждённым почтовым адресом.

Не подтверждённый email

Как видите, мы получили сообщение об ошибке. Если email был бы подтверждён, то мы бы прошли авторизацию без проблем.

Удаление пользователей, которые не подтвердили свою почту в течении сутки

В принципе, с подтверждением почты мы закончили, осталось разобраться с удалением пользователей из базы данных, которые не подтвердили свою почту в течении сутки с момента регистрации. Но перед тем как приступить к удалению пользователей, мы должны добавить поле date_regisration для таблицы users и изменить запрос на добавления пользователей в эту таблицу.

Открываем phpMyAdmin, выбираем таблицу users, кликаем на вкладку структура и нажимаем на кнопку OK.

структура таблицы users

Дальше, вводим название поля date_registration, тип выбираем datetime и нажимаем на кнопку сохранить.

Добавление нового поля в таблице users

Поле date_registration мы добавили, теперь нужно изменить запрос на добавления пользователей в таблицу users. То есть нужно указать, чтобы в поле date_registration записывалась дата регистрации пользователя.

Открываем файл register.php, идём к запросу на добавления пользователя в таблицу users и изменяем его таким образом:

        //Запрос на добавления пользователя в БД
        $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email, password, date_registration) VALUES ('".$first_name."', '".$last_name."', '".$email."', '".$password."', NOW())");
    

То есть, в конце первых скобок, через запятую добавляем поле date_registration, а в значение для этого поля, указываем функцию NOW().

Теперь, можно приступить и к удалению неподтверждённых пользователей. При регистрации, мы добавляем пользователя сразу в обеих таблиц, в таблицу users и в таблицу confirm_users. Поэтому, удалить мы будем его также из обеих таблиц.

И тут у меня возник вопрос, в какой момент лучше всего этого сделать, то есть когда удалить не подтверждённых пользователей? В процессе регистрации, в процессе авторизации или после того как пользователь нажал на ссылку для подтверждения почты. Подумал я, и пришёл к выводу, что лучше всего сделать это во всех этих трёх случаях.

Удаление не подтверждённых пользователей в процессе регистрации

Начнём мы с момента регистрации. Открываем файл register.php, и перед добавлением пользователя в таблицу users, добавляем этот запрос:

        //Удаляем пользователей из таблицы users, которые не подтвердили свою почту в течении сутки
        $query_delete_users = $mysqli->query("DELETE FROM `users` WHERE `email_status` = 0 AND `date_registration` < ( NOW() - INTERVAL 1 DAY )");
        if(!$query_delete_users){
            exit("<p><strong>Ошибка!</strong> Сбой при удалении просроченного аккаунта. Код ошибки: ".$mysqli->errno."</p>");
        }
    

В этом запросе мы указываем, что необходимо удалить пользователей, которые не подтвердили свою почту в течении сутки с момента регистрации, то есть у которых значение поля email_status равна нулю и разница между текущем временем ( функция NOW() ) и одной сутки (INTERVAL 1 DAY ) равна больше даты регистрации из поля date_registration.

Теперь, перед тем как составить токен и добавить пользователя в таблицу confirm_users, также добавим запрос на удаления не подтверждённых пользователей, но уже из таблицы confirm_users.

        //Удаляем пользователей из таблицы confirm_users, которые не подтвердили свою почту в течении сутки
        $query_delete_confirm_users = $mysqli->query("DELETE FROM `confirm_users` WHERE `date_registration` < ( NOW() - INTERVAL 1 DAY)");
        if(!$query_delete_confirm_users){
            exit("<p><strong>Ошибка!</strong> Сбой при удалении просроченного аккаунта(confirm). Код ошибки: ".$mysqli->errno."</p>");
        }

        //Составляем зашифрованный и уникальный token
        $token=md5($email.time());
    

Теперь, перед тем как зарегистрировать нового пользователя, будут удаляться не подтверждённые пользователи.

Удаление не подтверждённых пользователей в процессе авторизации

Открываем файл auth.php, и перед запросом на выборе пользователя из таблицы users, добавляем сразу два запроса для удаления не подтверждённых пользователей из таблицы users и из таблицы confirm_users.

        //Удаляем пользователей с таблицы users, которые не подтвердили свою почту в течении сутки
        $query_delete_users = $mysqli->query("DELETE FROM `users` WHERE `email_status` = 0 AND `date_registration` < ( NOW() - INTERVAL 1 DAY )");
        if(!$query_delete_users){
            exit("<p><strong>Ошибка!</strong> Сбой при удалении просроченного аккаунта. Код ошибки: ".$mysqli->errno."</p>");
        }


        //Удаляем пользователей из таблицы confirm_users, которые не подтвердили свою почту в течении сутки
        $query_delete_confirm_users = $mysqli->query("DELETE FROM `confirm_users` WHERE `date_registration` < ( NOW() - INTERVAL 1 DAY)");
        if(!$query_delete_confirm_users){
            exit("<p><strong>Ошибка!</strong> Сбой при удалении просроченного аккаунта(confirm). Код ошибки: ".$mysqli->errno."</p>");
        }

        // (4) Место для составления запроса к БД
        //Запрос в БД на выборке пользователя.
        $result_query_select = $mysqli->query("SELECT * FROM `users` WHERE email = '".$email."' AND password = '".$password."'");
    

Удаление не подтверждённых пользователей в процессе подтверждения почты

Открываем файл activation.php и перед запросом на выборке токена из таблицы confirm_users, добавляем те же запросы для удаления неподтверждённых пользователей, из таблицы users и confirm_users.

        //Удаляем пользователей с таблицы users, которые не подтвердили свою почту в течении сутки
        $query_delete_users = $mysqli->query("DELETE FROM `users` WHERE `email_status` = 0 AND `date_registration` < ( NOW() - INTERVAL 1 DAY )");
        if(!$query_delete_users){
            exit("<p><strong>Ошибка!</strong> Сбой при удалении просроченного аккаунта. Код ошибки: ".$mysqli->errno."</p>");
        }


        //Удаляем пользователей из таблицы confirm_users, которые не подтвердили свою почту в течении сутки
        $query_delete_confirm_users = $mysqli->query("DELETE FROM `confirm_users` WHERE `date_registration` < ( NOW() - INTERVAL 1 DAY)");
        if(!$query_delete_confirm_users){
            exit("<p><strong>Ошибка!</strong> Сбой при удалении просроченного аккаунта(confirm). Код ошибки: ".$mysqli->errno."</p>");
        }

        //Делаем запрос на выборке токена из таблицы confirm_users
        $query_select_user = $mysqli->query("SELECT `token` FROM `confirm_users` WHERE `email` = '".$email."'");
    

И на этом завершается эта длинная статья. Надеюсь, что Вы хорошо освоили этот урок и теперь Вы точно знаете, как реализовать функционал подтверждения почты. А следующая статья будет о том, как реализовать функционал восстановления пароля, так что не забудьте подписаться на новые статьи. Желаю Вам всего хорошего!

Понравилась статья?

Тогда поделитесь ею с друзьями и подпишитесь на новые интересные статьи.

Поделиться с друзьями:

Подписаться на новые статьи:

Delivered by FeedBurner

Поддержите пожалуйста мой проект!

<< Предыдущая статьяСледующая статья >>

Если у Вас есть какие-то вопросы или предложения, то можете писать их в комментариях или мне на почту sergiu1607@gmail.com. И если Вы заметили какую-то ошибку в статье, то прошу Вас, сообщите мне об этом, и в ближайшее время я всё исправлю.

Добавляйтесь ко мне в друзья в:

Добавляйтесь в мои группы:

Подпишитесь на мои каналы:

Автор статьи: Мунтян Сергей

Копирование материалов с сайта sozdatisite.ru ЗАПРЕЩЕНО!!!

Дата добавления: 2017-06-16 01:00:59