За последние 24 часа нас посетили 20355 программистов и 1300 роботов. Сейчас ищут 610 программистов ...

Подтверждение почты при регистрации — PHP

Тема в разделе "PHP для новичков", создана пользователем igor_khod, 1 июн 2023.

  1. igor_khod

    igor_khod Гость

    С нами с:
    30 ноя 2022
    Сообщения:
    1
    Симпатии:
    0
    Здравия, коллеги!

    Помогите разобраться и дайте идею как решить эту задачу.

    Создал форму регистрации, подключил базу через PDO RedeanPHP( MySQL ), в модуле формы формируется и отправляется на зарегистрированный email письмо со ссылкой для подтверждения. Всё работает без проблем. Проблема возникла после создания файла подтверждения(email_verification.php), который должен запускаться через ссылку, указанную в письме. Проблема в том, что каким-то образом, код файла email_verification.php выполняется независимо от того, обращались ли к этому файлу активации или нет. То есть, в значение поля данных пользователя (statusactivation) записывается статус подтверждения: 1, что email уже подтверждён. Если закомментировать оператор изменения статуса подтверждения, то в записи пользователя в базе данных сохраняется изначальное значение: 0.

    Код активационного файла (email_verification.php):
    PHP:
    1. <?php
    2. require "rb.php"; //Подключение модуля RedBeanPHP для работы с базами
    3.  
    4. R::setup( 'mysql:host=localhost;dbname=mydatabase','user', 'password' ); //Подключение базы данных for both mysql or mariaDB
    5. if (!empty($_GET['code']) && isset($_GET['code'])) { //Проверка на наличие активационного кода в адресной строке
    6.     $code = $_GET['code']; //активационный код, переданный через адресную строку браузера.
    7.     $user = R::findOne('users', 'codeactivation = ?', [$code]); //Поиск записи в базе с совпадающим активационным кодом из письма подтверждения и из списка записей базы данных
    8.     if ($user) { //Пользователь, у которого совпал активационный код в базе и письме. Если найден.
    9.         switch ($user->statusactivation) {   //Выбор в зависимости от статуса активации
    10.             case  (0):   // статус email - не подтверждён
    11.                 $user->statusactivation = 1; // присваиваем полю "statusactivation" значение 1 - "подтверждён"
    12. // В базу данных записывается именно значение переменной из строки 11. Даже если этот файл вообще не запускался на выполнение!
    13. // Если я закомментирую строку 11 или вообще удалю этот файл из проекта,
    14. // то в базе будет находиться статус активации, заданный при регистрации пользователя: statusactivation = 0,
    15.                 R::store($user); // Сохраняем изменённую запись
    16.                 $msg = "Ваша учётная запись активирована";
    17.                 break;
    18.             case (1):  // статус email - уже подтверждён
    19.                 $msg = "Ваша учётная запись уже подтверждена и не нуждается в дополнительной активации";
    20.                 break;
    21.             default:
    22.                 $msg = "Сбой в значении статуса подтверждения email пользователя.";
    23.         }
    24.     } else {
    25.         $msg = "Неправильный код активации или такой пользователь не существует.";
    26.     }
    27. }
    28. echo $msg;
    29. ?>
    фрагмент формы регистрации:
    PHP:
    1.     if (empty($errors)) {//ошибок нет, теперь сохраняю результат регистрации в базу данных
    2.         $user = R::dispense('users'); //Открываю таблицу базы данных для записи
    3.         $user->login = $data['login'];
    4.         $user->email = $data['email'];
    5.         $user->codeactivation = password_hash($data['email'] . time(), PASSWORD_DEFAULT); //Формирование кода активации
    6.         $stringactivecode = $user->codeactivation;
    7.         $user->statusactivation = 0; // Ячейка, хранящая статус активации
    8.         $userstatus = $user->statusactivation;
    9.         $user->password = password_hash($data['password'], PASSWORD_DEFAULT);
    10.         $id = R::store($user); //Сохраняю пользователя в базе
    11.         echo '<p style="color:green;">Вы успешно зарегистрированы!<br/>  Вам необходимо подтвердить свой email. <br/>
    12.        На ваш email отправлено письмо с инструкцией по подверждению вашего email<br/>
    13.        Можете перейти на <a href="/">главную</a>  страницу.</p>';
    14. //Формирую сообщение на почту о необходимости подтвердить свой email.
    15.         if ((isset($userstatus)) && ($userstatus === 0)) { // сообщение пользователю о подтверждении email
    16.             $message = "<html lang='ru'></body><div><div>Здравствуйте, уважаемый посетитель(ница) нашего сайта, </br>
    17.            Вы успешно зарегистрированы. </br>Для активации вашей учётной записи Вам нужно подтвердить адрес своей электронной почты. </br>
    18.            Кликните на следующую ссылку: </div>";
    19.             $link = $_SERVER['HTTP_HOST'] . '/verify/email_verification.php?code=' . $stringactivecode; //Формирую ссылку на файл активации
    20.             $message .= "<div><a href=$link>Кликните здесь</a></div>
    21.        </body></html>";
    22.         }