E-mail активация для регистрационной формы

Начальные шаги

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

Изначально работа будет начинаться с создания интерфейса формы. Вам нужно создать два файла: один из них будет содержать непосредственно саму форму, а второй будет служить для контролирования процесса взаимодействия с базой данных сайта. Вы можете назвать эти файлы как вашей душе угодно. В расматриваемом примере первый файл будет называться register.php, второй - verify.php.

Ниже предоставлено содержание файла register.php.

Регистрационная форма
<html>
<body>
<form action="verify.php" method="post" name="register">
Username: <input type="text" name="username" />
Password: <input type="text" name="password" />
Email: <input type="text" name="email" />
<input type="submit" />
</form>
</body>
</html>
На данном этапе мы устанавливаем, что форма взаимодействия будет носить название verify.php, и даем название основной форме с помощью команды name. Далее сохраняем этот файл и выкладываем его на сервер вашего хостинга. Пока оставляем файл формы.

Работа над созданием обработчика событий

Теперь займемся непосредственно самим verify.php. Он будет использоваться для двух вещей. Во-первых, для ввода информации в базу данных. Во-вторых, он будет отправлять регистрационный код на e-mail пользователя. Поэтому нам будет нужна конструкция “If” для разделения этих двух процессов.

Так каким же образом мы будем определять, какую операцию выполнять – ввод данных или отправку регистрационного кода? Для этого будет нужно ввести скрытые значения в форму регистрации следующим образом:

Скрытые значения для регистрационной формы
<html>
<body>
<form action="verify.php" method="post" name="register">
Username: <input type="text" name="username" />
Password: <input type="text" name="password" />
Email: <input type="text" name="email" />
<input type="hidden" name="form_submitted" value="1"/>
<input type="submit" />
</form>
</body>
</html>
Теперь мы можем определить условие ”установлено ли скрытое значение?” следующим образом:
if ($_POST['form_submitted'] == '1') {
 
## Form was submitted,the user is registering!
 
} else{
 
## No value found, user must be activating their account!
 
}
После создания формы интерфейса и условия нам надо сдать немного назад и поработать над базой данных.

Моделирование базы данных под  e-mail активацию

В рассматриваемом примере мы создали таблицу под названием “users” с соответствующими полями “id, status, username, password, email, and activationkey”. В принципе и вам советуем придерживаться схожего регламента. Можно выполнить данные действия с помощью следующего SQL-запроса.

Код SQL запроса - Создание таблицы
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` varchar(20) NOT NULL,
`username` varchar(20) NOT NULL,
`password` varchar(20) NOT NULL,
`email` varchar(20) NOT NULL,
`activationkey` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `email` (`email`),
UNIQUE KEY `activationkey` (`activationkey`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

Если все сделать корректно, вы должны увидеть следующую картину маслом (внешний вид базы данных будет отличаться от предложенного лишь в том случае, если вы используете PHPMyAdmin или MySQL):

php_email

Вставка регистрационных данных в базу данных

На данном этапе мы будем связывать все созданные ранее элементы воедино. Нам необходимо перво-наперво установить правильные отношения между формами и базой данных. Мы будем использовать mysql_connect и mysql_select_db functions для связи с базой данных.

Связывание с базой данных
mysql_connect("localhost", DATABASE, PASSWORD OR ;die(mysql_error());
 
mysql_select_db("USER_TABLENAME ") OR die(mysql_error());

Как вы сами прекрасно видите, нам нужно внести изменения только в базу данных , пароль и название таблицы. В идеале лучше назвать таблицу “users”, как сделано в рассматриваемом примере. Пароль и имя базы данных могут быть созданы с помощью MySQL, если у вас есть соответствующие полномочия на хостинге. Иначе вам нужно будет связаться с хостинг-мастером и получить их.

Ваш файл verify.php должен выглядеть следующим образом:

<?php
 
mysql_connect("localhost", DATABASE, "PASSWORD") or die(mysql_error());
 
mysql_select_db("USER_TABLENAME ") or die(mysql_error());
 
if ($_POST['form_submitted'] == '1') {
##User is registering, insert data until ;we can activate it
 
$activationKey = mt_rand() . mt_rand() . mt_rand() . mt_rand() . mt_rand();
 
$sql="INSERT INTO users (username, password, email, activationkey, status)
 
VALUES
 
('$_POST[username]', '$_POST[password]', '$_POST[email]','$activationKey', 'verify')";
 
if (!mysql_query($sql))
 
{
 
die('Error: ' . mysql_error());
 
}
 
} else {
 
}
 
?>

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

Генерация случайного ключа и ввод значений в базе данных

Для генерации рандомного ключа воспользуемся функцией mt_rand(). Для того, чтобы задать длину ключа, нужно несколько раз подряд через точку написать данную функцию ( в рассматриваемом примере длина ключа 5).

activationKey =  mt_rand() . mt_rand() . mt_rand() . mt_rand() . mt_rand();

Теперь займемся вводом данных в нашу базу данных

Ввод данных в нашу базу данных
$sql="INSERT INTO users (username, password, email, activationkey, status) VALUES ('$_POST[username]',
 '$_POST[password]', '$_POST[email]', '$activationKey', 'verify')"
;

 
if (!mysql_query($sql))
 
{
 
die('Error: ' . mysql_error());
 
}

Как вы видите, мы дополнили все значения регистрационного поля командой $_POST. Также мы внесли  переменную $activationKey и вставили слово ‘verify’ в поле статуса. Это необходимо для определения, кто прошел проверку, а кто нет.

Файл verife.php будет выглядеть следующим образом:

 

 

Отправка регистрационного ключа

Отправка почты с помощью РНР довольно простой и безболезненный процесс. Нам только нужно ввести пару значений в уже готовую РНР функцию mail(). В рассматриваемом примере мы пользуемся четырьмя параметрами: адрес получателя, тема сообщения, непосредственно само сообщение и обратный адрес.

Отправка e-mail в РНР - verify.php
echo "An email has been sent to $_POST[email] with an activation key. Please check your mail to complete registration.";
 
##Send activation Email
 
$to = $_POST[email];
 
$subject = " YOURWEBSITE.com Registration";
 
$message = "Welcome to our website!\r\rYou, or someone using your email address, has completed registration at YOURWEBSITE.com.
You can complete registration by clicking the following link:\rhttp://www.YOURWEBSITE.com/verify.php?$activationKey\r\rIf this is an error,
 ignore this email and you will be removed from our mailing list.\r\rRegards,\ YOURWEBSITE.com Team"
;

 
$headers = 'From: noreply@ YOURWEBSITE.com' . "\r\n" .
 
'Reply-To: noreply@ YOURWEBSITE.com' . "\r\n" .
 
'X-Mailer: PHP/' . phpversion();
 
mail($to, $subject, $message, $headers);

Не будем останавливаться подробно на данном коде. При желании вы можете ознакомиться с деталями в статье на нашем сайте "отправка e-mail” .

Проверка соответствия регистрационного кода

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

Дальнейшие изменения в verify.php
##User isn't registering, check verify code and change activation code to null, status to activated on success
 
$queryString = $_SERVER['QUERY_STRING'];
 
$query = "SELECT * FROM users";
 
$result = mysql_query($query) or die(mysql_error());
 
while($row = mysql_fetch_array($result)){
 
if ($queryString == $row["activationkey"]){
 
echo "Congratulations!" . $row["username"] . " is now the proud new owner of a YOURWEBSITE.com account.";
 
$sql="UPDATE users SET activationkey = '', status='activated' WHERE (id = $row[id])";
 
if (!mysql_query($sql))
 
{
 
die('Error: ' . mysql_error());
 
}
 
}
 
}

Уделите особое внимание тому факту, что мы использовали SQL команду UPDATE вместо INSERT. Ну и наконец необходимо обезопасить наш скрипт:

 

Последние изменения в verify.php
mysql_connect("localhost", DATABASE, "PASSWORD") or die(mysql_error());
 
mysql_select_db("USER_TABLENAME") or die(mysql_error());
 
if ($_POST['form_submitted'] == '1') {
##User is registering, insert data until we can activate it
 
$activationKey = mt_rand() . mt_rand() . mt_rand() . mt_rand() . mt_rand();
$username = mysql_real_escape_string($_POST[username]);
$password = mysql_real_escape_string($_POST[password]);
 
$email = mysql_real_escape_string($_POST[email]);
 
$sql="INSERT INTO users (username, password, email, activationkey, status) VALUES ('$username', '$password', '$email',
'$activationKey', 'verify')"
;

 
if (!mysql_query($sql))
 
{
 
die('Error: ' . mysql_error());
 
}
 
echo "An email has been sent to $_POST[email] with an activation key. Please check your mail to complete registration.";
 
##Send activation Email
 
$to = $_POST[email];
 
$subject = " YOURWEBSITE.com Registration";
 
$message = "Welcome to our website!\r\rYou, or someone using your email address, has completed registration at YOURWEBSITE.com.
You can complete registration by clicking the following link:\rhttp://www.YOURWEBSITE.com/verify.php?$activationKey\r\r
If this is an error, ignore this email and you will be removed from our mailing list.\r\rRegards,\ YOURWEBSITE.com Team"
;

 
$headers = 'From: noreply@ YOURWEBSITE.com' . "\r\n" .
 
'Reply-To: noreply@ YOURWEBSITE.com' . "\r\n" .
 
'X-Mailer: PHP/' . phpversion();
 
mail($to, $subject, $message, $headers);
 
} else {
 
##User isn't registering, check verify code and change activation code to null, status to activated on success
 
$queryString = $_SERVER['QUERY_STRING'];
 
$query = "SELECT * FROM users";
 
$result = mysql_query($query) or die(mysql_error());
 
while($row = mysql_fetch_array($result)){
 
if ($queryString == $row["activationkey"]){
 
echo "Congratulations!" . $row["username"] . " is now the proud new owner of an YOURWEBSITE.com account.";
 
$sql="UPDATE users SET activationkey = '', status='activated' WHERE (id = $row[id])";
 
if (!mysql_query($sql))
 
{
 
die('Error: ' . mysql_error());
 
}
 
}
 
}
 
}

 

Ну вот в принципе и все. Дерзайте!:)

 

 

Добавить комментарий


Защитный код
Обновить

Разработчику

Скрипты