Регистрация пользователя
Мы уже делали регистрацию Вас в качестве админа, когда делали настройку базы данных. Покажу пример как сделать регистрацию пользователя на своём сайте, с проверкой валидации данных, наличие уже зарегистрированного пользователя.
Материал будет простым, без доскональной проработки дизайна, суть – как работает регистрация.
В page.css добавим классы.
main {
display: grid;
}
.form {
padding: 10px;
place-self: center;
display: inline-block;
line-height: 2em;
vertical-align: middle;
text-align: left;
text-decoration: none;
user-select: none;
color: rgb(0,0,0);
outline: none;
border: 1px solid rgba(0,0,0,.4);
border-top-color: rgba(0,0,0,.3);
border-radius: 5px;
background: #ffffff;
box-shadow:
0 0 3px rgba(0,0,0,0) inset,
0 1px 1px 1px rgba(255,255,255,.2),
0 -1px 1px 1px rgba(0,0,0,0);
transition: .2s ease-in-out;
}
input {
display: block;
margin-left: auto;
margin-right: auto;
}
Элементу main мы присваиваем Grid Layout, или попросту делаем его гридом. Нам это нужно чтобы выводить формы регистрации, авторизации, различные сообщения по центру.
Класс form у меня не отличается, внешним видом, от block. Отличие в первых двух строчках, где вторая центрирует элемент внутри грида.
inputы будут центрироваться по горизонтали.
Создадим файл tpl/reg.tpl - форму регистрации.
<form action="reg.php?go=ok" class="form" method="post">
<?=$content["error"] ?>
<input name="login" placeholder="Логин" value="<?=$content["login"] ?>"><br/>
<input name="email" placeholder="Эл. почта" value="<?=$content["email"] ?>"><br/>
<input type="password" name="password" placeholder="Пароль"><br/>
<input type="submit" value="Зарегистрароваться">
</form>
reg.php?go=ok - Сообщает GET методом о том, что нажата кнопка регистрации и надо выполнять проверку и процедуру регистрации.
$content["error"] - Тут будет выводится сообщение если есть ошибка при регистрации.
$content["login"] и $content["email"] - В случае ошибки регистрации в них будут отображаться данные введённые пользователем, чтобы он видел что ввёл и не вводил заново.
Там же создадим файл message.tpl который будет отвечать за вывод сообщений.
<form action="<?=$content["url"] ?>" class="form" method="post">
<?=$content["message"] ?>
<input type="submit" value="<?=$content["button"] ?>">
</form>
$content["url"] - Куда отправлять после нажатия кнопки.
$content["message"] - Текст сообщения.
$content["button"] - Название кнопки.
В корневой папке сайта создадим файл регистрации reg.php.
<?php
//подключаем класс
include_once 'PHPTemplate.php';
//подключаем функции
include_once 'function.php';
//Доступ к БД
define($config['unicod'] , true);
include_once 'config.php';
include_once 'db.php';
// Подключение к БД
$connection = @mysqli_connect($dbsettings['server'], $dbsettings['user'], $dbsettings['pass'], $dbsettings['name']);
mysqli_set_charset ( $connection , "utf8" );
if ($connection == false){
print("Ошибка: Невозможно подключиться к MySQL " . mysqli_connect_error());
}
//получаем данные
$go = valid($_GET['go']);
//присоединяем шаблон
$tpl = new PHPTemplate('./tpl/page.tpl');
//присоединяем блок пользователя
include_once 'user.php';
//присоединяем форму регистрации
$tplForm = new PHPTemplate('./tpl/reg.tpl');
if($go=="ok"){
//регистрируем пользователя
$content["login"]=valid($_POST['login']);
$content["email"]=valid($_POST['email']);
$content["password"]=valid($_POST['password']);
//проверка заполнености полей
if (!$content["password"]) {
$err="Введите пароль!";
}
else if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$content["password"])) {
$err="Используйте только буквы и цифры в Пароле!";
}
else if(strlen($content["password"]) < 6 or strlen($content["password"]) > 30){
$err = "Длинна Пароля должна быть не менее 6 знаков и не более 15 знаков";
}
if (!$content["email"]) {
$err="Введите электронную почту!";
}
// Проверим валидность мыла
else if (!preg_match("/^(?:[a-z0-9]+(?:[-_.]?[a-z0-9]+)?@[a-z0-9]+(?:\.?[a-z0-9]+)?\.[a-z]{2,5})$/i",$content["email"]))
{
$err="Не корректный формат почты!";
}
if (!$content["login"]) {
$err="Введите логин!";
}
else if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$content["login"])) {
$err="Используйте только буквы и цифры в Логине!";
}
else if(strlen($content["login"]) < 3 or strlen($content["login"]) > 30){
$err = "Длинна Логина должна быть не менее 3 знаков и не более 15 знаков";
}
// проверяем, не сущестует ли емайла
$sql = "SELECT COUNT(*) as count FROM `Users` ";
$sql .= "WHERE (Email='".$content[\"email\"]."')";
$result = mysqli_query($connection, $sql);
$row = mysqli_fetch_assoc( $result );
if ($row['count'] > 0) {
$err="Такой емайл уже зарегистрирован ранее!";
}
// проверяем, не сущестует ли логина
$sql = "SELECT COUNT(*) as count FROM `Users` ";
$sql .= "WHERE (Login='".$content[\"login\"]."')";
$result = mysqli_query($connection, $sql);
$row = mysqli_fetch_assoc( $result );
if ($row['count'] > 0) {
$err="Такой логин занят!";
}
//регистрация или вывод ошибки
if($err !=""){
//ошибка регистрации
$content["error"]=" <div style='background-color: red;color: #fff;padding: 5px;margin: 15px'>".$err."</div>";
}else{
//регистрация
$Table = "INSERT INTO Users SET";
$Table .= " Login='".$content[\"login\"]."',";
$Table .= " Password='".md5($content[\"password\"])."',";
$Table .= " Email='".$content[\"email\"]."',";
$Table .= " UniId='".generateCode(6)."',";
$Table .= " Rang='User'";
mysqli_query($connection,$Table) or die("MySQL Error: ".mysql_error()."");
//отправляем письмо об регистрации
$text_reg='
Вы зарегистрировались на сайте '.$conf['url'].'<br>
Ваш логин: '.$content["login"].'<br>
Ваш пароль: '.$content["password"];
$url=str_replace("https://", "", $conf['url']);
$themes="Регистрация на ".$conf['url'];
$email_site='Robot_registration@'.$url;
$headers = 'Content-type: text/html; charset=utf-8 ' . "\r\n";
$headers .= 'From: '.$email_site.' ' . "\r\n";
// Вышлем письмо
$ath = mail ($content["email"], $themes, $text_reg, $headers);
// Проверим успешность отправки
if (!$ath)
{
//Ошибка при отправке письма
$email_text="Не удалось отправить сообщение на Вашу почту.";
}else{
$email_text="Ваши регистрационные данные отправлены на Вашу почту.";
}
//создаём сообщение
$tplForm = new PHPTemplate('./tpl/message.tpl');
$content["url"]="login.php";
$content["message"]="Успешная регистрация!<br/>".$email_text;
$content["button"]="Авторизация";
}
}
$content["title"]="Регистрация на сайте";
$content["horizontal_menu"]="Регистрация на сайте";
$tplForm->set('content', $content);
$content["text"]=$tplForm->fetch();
$tpl->set('content', $content);
//показываем страницу
echo $tpl->fetch();
?>

Сначала мы делаем все подготовительные действия для работы скрипта. Подключаемся к БД, подключаем необходимые файлы.
Получаем данные для переменной $go, чтобы понять, выводить пустую форму регистрации или начать процедуру регистрации.
Все поступающие данные мы будем пропускать через функцию valid, которая проверяет наличие запрещённых символов, которые могут помешать правильной работе MySQL.
Пропишем её в файле function.php.
//проверка валидации
function valid ($res) {
$id = trim(strip_tags(strval($res)));
if(preg_match('/[\/\\]/', $id))
$err_text='Атака хакера! // no slashes';
if(preg_match('/(union|select|from|where)/i', $id))
$err_text='Атака хакера! // no sqli select keywords';
if(preg_match('/(group|order|having|limit)/i', $id))
$err_text='Атака хакера! // no sqli select keywords';
if(preg_match('/(into|file|http:|https:|case)/i', $id))
$err_text='Атака хакера! // no sqli operators';
if(preg_match('/(--|#|\/\*)/', $id))
$err_text='Атака хакера! // no sqli comments';
if(preg_match('/(&|\|)/', $id))
$err_text='Атака хакера! // no boolean operators';
if($err_text!=''){
exit($err_text);
}else{
$id=trim(strip_tags($id));
return $id;
}
}
В случае если $go=="ok", получаем данные введённые пользователем, проверяем на правильную наполненность. Тут важно учесть, то что длина логина и пароля, у меня не более 15 знаков, а проверка идёт от 30 знаков. Это связанно с тем, что кириллический символ функция strlen считает за 2.
Затем проверяем существование Емайла и Логина в БД, путём получение данных MySQL.
Если, на каком-то этапе регистрации, происходит ошибка, то помещаем комментарий в $err.
Если переменная $err содержит комментарий - переносим его в $content["error"] и показываем форму регистрации для исправления ошибки.

Если $err пустая – добавляем запись в БД и отправляем письмо на электронную почту с данными логина и пароля.
Пароль мы пропускаем через md5, чтобы в случае взлома БД не было доступа к аккаунтам.