1. Главная / Блог / PHP+MySQL / Регистрация пользователя

Регистрация пользователя


Нет комментариев.


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

Материал будет простым, без доскональной проработки дизайна, суть – как работает регистрация.


В 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, которая проверяет наличие запрещённых символов, которые могут помешать правильной работе .

Пропишем её в файле 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, чтобы в случае взлома БД не было доступа к аккаунтам.



Нет комментариев.


Оставить комментарий

Ваше имя:

Оценка