В этом примере реализуем верификацию регистрации по email на PHP. Для этого будем генерировать и использовать специальный код активации.
Внимание! Данный код предоставлен как пример решения поставленной задачи. Он не служит эталоном.
База данных
Создадим таблица users, в которую будем записывать данные пользователя и код активации.
CREATE TABLE IF NOT EXISTS `users` ( `uid` int(11) NOT NULL AUTO_INCREMENT, `email` varchar(300) NOT NULL UNIQUE, `password` varchar(300) NOT NULL, `activation` varchar(300) NOT NULL UNIQUE, `status` enum('0','1') NOT NULL DEFAULT '0', PRIMARY KEY (`uid`) );
HTML
Пример формы регистрации.
<form action="" method="post"> <label>Email</label> <input type="text" name="email" class="input" autocomplete="off"/> <label>Password </label> <input type="password" name="password" class="input" autocomplete="off"/><br/> <input type="submit" class="button" value="Registration" /> <span class='msg'><?php echo $msg; ?></span> </form>
db.php
Конфигурационный файл с основными параметрами и подключением к базе.
<?php define('DB_SERVER', 'localhost'); define('DB_USERNAME', 'username'); define('DB_PASSWORD', 'password'); define('DB_DATABASE', 'database'); $connection =@mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE); $base_url='http://www.youwebsite.com/email_activation/'; ?>
index.php
Сохраняем пользователей в таблицу users. Код активации генерируем с помощью MD5.
<?php include 'db.php'; $msg=''; if(!empty($_POST['email']) && isset($_POST['email']) && !empty($_POST['password']) && isset($_POST['password']) ) { $email=mysql_real_escape_string($_POST['email']); $password=mysql_real_escape_string($_POST['password']); // регулярное выражение для проверки email-а $regex = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/'; if(preg_match($regex, $email)) { $password=md5($password); // пароль $activation=md5($email.time()); // email + timestamp $count=mysqli_query($connection,"SELECT uid FROM users WHERE email='$email'"); // проверка email-а if(mysqli_num_rows($count) < 1) { mysqli_query($connection,"INSERT INTO users(email,password,activation) VALUES('$email','$password','$activation')"); // отправка письма include 'smtp/Send_Mail.php'; $to=$email; $subject="Проверка Email-а"; $body='Hi, <br/> <br/> Активация! Пожалуйста перейдите по ссылки для активации вашего аккаунта. <br/> <br/> <a href="'.$base_url.'activation/'.$activation.'">'.$base_url.'activation/'.$activation.'</a>'; Send_Mail($to,$subject,$body); $msg= "Регистрация прошла успешно! Пройдите активацию через email."; } else { $msg= 'Данный email уже занят.'; } } else { $msg = 'Не валидный email.'; } } // HTML Часть ?>
Send_Mail.php
Для отправки email сообщений используется библиотека PHPMailer. Но можно использовать и стандартный mail().
Отправка email сообщения. Исправьте SMTP параметры.
<?php function Send_Mail($to,$subject,$body) { require 'class.phpmailer.php'; $from = "from@yourwebsite.com"; $mail = new PHPMailer(); $mail->IsSMTP(true); // use SMTP $mail->IsHTML(true); $mail->SMTPAuth = true; // активируем SMTP аутентификацию $mail->Host = "tls://smtp.yourwebsite.com"; // SMTP хост $mail->Port = 465; // SMTP порт $mail->Username = "SMTP_Username"; // SMTP имя пользователя $mail->Password = "SMTP_Password"; // SMTP пароль $mail->SetFrom($from, 'From Name'); $mail->AddReplyTo($from,'From Name'); $mail->Subject = $subject; $mail->MsgHTML($body); $address = $to; $mail->AddAddress($address, $to); $mail->Send(); } ?>
activation.php
В зависимости от кода активации выставляем статус пользователю 0 или 1.
<?php include 'db.php'; $msg=''; if(!empty($_GET['code']) && isset($_GET['code'])) { $code=mysql_real_escape_string($_GET['code']); $c=mysqli_query($connection,"SELECT uid FROM users WHERE activation='$code'"); if(mysqli_num_rows($c) > 0) { $count=mysqli_query($connection,"SELECT uid FROM users WHERE activation='$code' and status='0'"); if(mysqli_num_rows($count) == 1) { mysqli_query($connection,"UPDATE users SET status='1' WHERE activation='$code'"); $msg="Ваш аккаунт активирован"; } else { $msg ="Ваш аккаунт уже активирован"; } } else { $msg ="Неверный код активации"; } } ?> //HTML часть <?php echo $msg; ?>
.htaccess
Для соблюдения ЧПУ преобразуем URL вида:
http://website.com/activation.php?code=ACTIVATION_CODE
к виду:
http://website.com/activation/ACTIVATION_CODE
Для этого прописываем в файле .htaccess
RewriteEngine On RewriteRule ^activation/([a-zA-Z0-9_-]+)$ activation.php?code=$1 RewriteRule ^activation/([a-zA-Z0-9_-]+)/$ activation.php?code=$1
Результат
После регистрации пользователя, ему на email отсылается письмо с ссылкой активацией emai адреса. При переходе по ссылке, скрипт проверяет наличие такого кода активации в базе, и в случае нахождения, изменяет статус данного email адреса на «активирован».