Как на MVC при помощи PHP создать регистрацию с хешированием пароля
В этой статье мы рассмотрим, как создать регистрацию пользователя в вашей системе.
Создаем в базе данных таблицу с именем users, она будет иметь следующий вид:
Далее заходим в папку config и открываем файл routes.php. Тут нам нужно прописать путь к методу отрисовки страницы с регистрацией:
'user/register' => 'user/register',
Теперь создадим форму с полями для регистрации. Она будет содержать следующее: поле для ввода логина, поле для ввода пароля, поле для ввода адреса электронной почты и кнопка для отправки данных. Также придадим форме более приятный вид с помощью CSS:
<html>
<head></head>
<body>
<div style="color: red; font-size: 14px; padding: 20px; margin: 0 auto; display: block; width:400px;">
<?php if (isset($errors) && is_array($errors)): ?>
<ul>
<?php foreach ($errors as $error): ?>
<li> - <?php echo $error; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>
<form action="" method="post" class="form-login" style="display: block; width: 400px; margin: 0 auto; padding: 20px; text-align: center;">
<h2><center>Авторизация</h2></center><br>
<input type="text" name="email" placeholder="E-mail" value="<?php echo $email; ?>"/><br><br>
<input type="text" name="login" placeholder="Логин" value="<?php echo $login; ?>"/><br><br>
<input type="password" name="password" placeholder="Пароль" value="<?php echo $_POST['password']; ?>"/><br><br>
<div class="os"></div>
<input type="submit" name="submit" class="btn btn-default" style="width: 120px;" value="Вход" />
<div class="os"></div>
<div style="font-size: 14px; color: #777;">
Если вы еще по какой то причине не зарегистрированы на нашем сервисе, то не теряйте времени <a href="/user/register">зарегистрируйтесь</a> и вступайте в нашу команду.
</div>
</form>
</body>
</html>
Тут мы будем выводить ошибки, которые могут возникнуть в процессе регистрации – это неверное заполнение полей, ошибка подключения к базе данных и ошибки которые будут говорить о там, что логин или пароль заняты:
Теперь заходим в папку controllers и создаем там новый файл – UserController. Он будет отвечать за страницы, в которых пользователь, так или иначе, взаимодействует со своей учетной записью. Например, это может быть страница регистрации или же личный кабинет.
Внутри создаем класс UserController, в котором мы будем писать метод для отрисовки страницы регистрации. Метод будет содержать следующий код:
public function actionRegister()
{
$index['title'] = 'Регистрация';
// Объявим переменые, что не возникало ошибок
$login = false;
$email = false;
$password = false;
// Обработка формы
if (isset($_POST['submit']))
{
$login = $_POST['login'];
$email = $_POST['email'];
$password = $_POST['password'];
if (!User::checkPassword($password)) $errors[] = 'Вы не ввели пароль, пароль меньше 6-х символов';
if (!User::checkName($login)) $errors[] = 'Логин меньше 3-х символов';
if (!User::checkEmail($email)) $errors[] = 'Не верно указан E-mail';
else
{
// Проверяем существует ли пользователь
$checkEmail = User::checkUserEmail($email);
$checkLogin = User::checkUserLogin($login);
if ($checkLogin == true) $errors[] = 'Пользователь с таким Логином, уже зарегистрирован, введите другой Логин';
if ($checkEmail == true) $errors[] = 'Пользователь с таким E-mail, уже зарегистрирован, введите другой E-mail';
else
{
$hashed_password = User::generateHash($password); // Сохраняем Хеш пароля
if (!User::register($login, $email, $hashed_password)) $errors[] = 'Ошибка Базы Данных';
}
}
}
// Подключаем вид
require_once(ROOT . '/views/user/register.php');
return true;
}
Тут мы проверяем все поля на наличие ошибок, если возникает какая-то ошибка, то мы записываем ее в массив errors[]. Проверки осуществляются с помощью функций, которые находятся в модели User.
Теперь нужно создать модель User. Для этого заходим в папку models и создаем там новый файл с именем User.php. Внутри файла создаем класс User:
class User
{
}
Внутри этого класса создаем функции:
generateHash - функция хеширования пароля. Хеширование осуществляется с помощью функции crypt, которая принимает в себя строку с паролем и соль, которая усложнит созданный пароль.
function generateHash($password) {
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
$salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);
return crypt($password, $salt);
}
}
checkName, chekcPassword, checkEmail – это функции, которые проверяет правильность заполнения полей. Логин не должен быть короче двух символов, пароль не короче шести. Электронная почта проверяется на правильность с помощью фильтров вариации данных:
public static function checkName($name)
{
if (strlen($name) >= 2) return true;
else return false;
}
public static function checkPassword($password)
{
if (strlen($password) >= 6) return true;
else return false;
}
public static function checkEmail($email)
{
if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
else return false;
}
checkUserEmail, checkUserLogin – проверка, нет ли в базе данных введенного в поля логина и адреса электронной почты:
public static function checkUserEmail($email)
{
$db = Db::getConnection();
$sql = 'SELECT * FROM users WHERE email = :email';
$result = $db->prepare($sql);
$result->bindParam(':email', $email, PDO::PARAM_STR);
$result->execute();
$user = $result->fetch();
if ($user) return true;
else return false;
}
public static function checkUserLogin($login)
{
$db = Db::getConnection();
$sql = 'SELECT * FROM users WHERE login = :login';
$result = $db->prepare($sql);
$result->bindParam(':login', $login, PDO::PARAM_STR);
$result->execute();
$user = $result->fetch();
if ($user) return true;
else return false;
}
И сама функция записывающая данные в базу данных – register:
public static function register($login, $email, $password)
{
$db = Db::getConnection();
$sql = 'INSERT INTO users (login, email, password) VALUES (:login, :email, :password)';
// Получение и возврат результатов. Используется подготовленный запрос
$result = $db->prepare($sql);
$result->bindParam(':login', $login, PDO::PARAM_STR);
$result->bindParam(':email', $email, PDO::PARAM_STR);
$result->bindParam(':password', $password, PDO::PARAM_STR);
return $result->execute();
}
Таким образом мы получаем регистрацию с проверкой полей, которая сигнализирует о допущенных ошибках.

Комментарии ( 2 )
в скрипте UserController.php какая то ошибка Parse error: syntax error, unexpected 'public' (T_PUBLIC) in C:\OSPanel\domains\localhost\controllers\UserController.php on line 2 как поправить???? валидатор ругается на строчку public function actionRegister() { и вопрос по уроку формы для регистрации как я понимаю тут нет?
16.08.2018
gollum, все ошибки unexpected расшифровываются как внимательно посмотри на код перед тем, что в кавычках. Скорее всего фигурная скобка.
26.08.2018
🔔 Отдохните не много, может Вам будет интересно прочитать статьи пользователей нашего сайта.
Создание профиля или личного кабинета пользователя на MVC, PHP и SQL
Тег caption - это заголовок таблицы
Как узнать ID последней вставленной записи
Тег a - это ссылка
Тег applet - это апплет
Тег br - это перенос строки
Тег dd - это определение термина
Тег audio - это управление аудиофайлом
Тег b - это полужирный шрифт
Как добавить свой сайт в поисковые системы GOOGLE и YANDEX
Как разрезать изображение на части и склеить обратно из фрагментов, используя PHP и Ajax
В какие каталоги добавить свой сайт бесплатно