В этой статье мы создадим систему регистрации и авторизации. Что нам понадобиться для написания такой системы:
- Язык программирования PHP;
- Библиотека RedBeanPHP для соединения с базой данных;
- Язык гипертекстовой разметки (HTML);
- Каскадные стили таблиц (CSS);
- Фреймворк Bootstrap;
- Функции API для хеширования паролей;
- Локальный сервер XAMPP;
1. Создание базы данных
Создаем базу данных в интерфейсе “phpAdmin“. Базу данных называете как вам угодно, в “Сравнение” выбираем “utf8_general_ci”:

Таблицу создавать не надо, т.к. таблица будет создаваться при регистрации пользователя.
2. Соединение с базой данных
На локальном сервере XAMPP в папке “htdocs” создаем папку нашего будущего проекта. В этой папке создаем первый php файл “db.php”. Он нужен для соединения с базой данных.
Так как мы будем пользоваться библиотекой RedBeanPHP, тогда надо скачать библиотеку и подключить к проекту. Мы создадим в папке проекта папку “libs” и туда закинем библиотеку. Листинг файла db.php:
<?php // Подключаем библиотеку RedBeanPHP require "libs/rb-mysql.php"; // Подключаемся к БД R::setup( 'mysql:host=localhost;dbname=register', 'root', '' ); // Проверка подключения к БД if(!R::testConnection()) die('No DB connection!'); session_start(); // Создаем сессию для авторизации ?>
Имя пользователя для соединения c базой данных устанавливается по умолчанию (XAMPP), конечно если в phpMyAdmin вы их не меняли.
3. Создание шапки и подвала проекта
Создадим два файла и назовём их “header.php” и “footer.php”. Мы их будем подключать к нашим будущим формам. В статье “PHP. Динамическое создание страниц” можно изучить для чего это необходимо. Листинг файла header.php:
<!DOCTYPE html> <html lang="ru"> <head> <title><?php echo $title; ?></title> <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="css/style.css"> <meta content="text/html; charset=utf-8"> </head> <body>
Это обычная шапка проекта. Для подключения стилей создайте в проекте папку “css” и в ней создайте файл style.css, а также скачайте файл фреймворка Bootstrap и закиньте его в эту папку.
Переменная $title необходима для изменения названия страниц на разных формах (т.к. в проекте будет больше одной формы). Листинг файла footer.php:
</body> </html>
Листинг файла style.css:
form, h2, p{ width: 500px; margin-left: 300px; }
4. Создание форм
С помощью HTML, CSS и Bootstrap создадим необходимые формы приложения. В папке проекта создаем форму регистрации. Файл назовём “signup.php”. Листинг файла:
<?php $title="Форма регистрации"; // название формы require __DIR__ . '/header.php'; // подключаем шапку проекта require "db.php"; // подключаем файл для соединения с БД ?> <div class="container mt-4"> <div class="row"> <div class="col"> <!-- Форма регистрации --> <h2>Форма регистрации</h2> <form action="signup.php" method="post"> <input type="text" class="form-control" name="login" id="login" placeholder="Введите логин"><br> <input type="email" class="form-control" name="email" id="email" placeholder="Введите Email"><br> <input type="text" class="form-control" name="name" id="name" placeholder="Введите имя" required><br> <input type="text" class="form-control" name="family" id="family" placeholder="Введите фамилию" required><br> <input type="password" class="form-control" name="password" id="password" placeholder="Введите пароль"><br> <input type="password" class="form-control" name="password_2" id="password_2" placeholder="Повторите пароль"><br> <button class="btn btn-success" name="do_signup" type="submit">Зарегистрировать</button> </form> <br> <p>Если вы зарегистрированы, тогда нажмите <a href="login.php">здесь</a>.</p> <p>Вернуться на <a href="index.php">главную</a>.</p> </div> </div> </div> <?php require __DIR__ . '/footer.php'; ?> <!-- Подключаем подвал проекта -->
Итоговый дизайн формы регистрации:

В папке проекта создаем форму авторизации. Файл назовём “login.php”. Листинг файла:
<?php $title="Форма авторизации"; // название формы require __DIR__ . '/header.php'; // подключаем шапку проекта require "db.php"; // подключаем файл для соединения с БД ?> <div class="container mt-4"> <div class="row"> <div class="col"> <!-- Форма авторизации --> <h2>Форма авторизации</h2> <form action="login.php" method="post"> <input type="text" class="form-control" name="login" id="login" placeholder="Введите логин" required><br> <input type="password" class="form-control" name="password" id="pass" placeholder="Введите пароль" required><br> <button class="btn btn-success" name="do_login" type="submit">Авторизоваться</button> </form> <br> <p>Если вы еще не зарегистрированы, тогда нажмите <a href="signup.php">здесь</a>.</p> <p>Вернуться на <a href="index.php">главную</a>.</p> </div> </div> </div> <?php require __DIR__ . '/footer.php'; ?> <!-- Подключаем подвал проекта -->
Итоговый дизайн формы авторизации:

Формы будут обрабатываться с помощью метода POST. Обработка форм будет в файлах с формами.
5. Обработка формы регистрации
В файле “signup.php” после подключения файла с базой данных пишем код описанный ниже. Чтобы понять код читайте комментарии к нему. Листинг:
// Создаем переменную для сбора данных от пользователя по методу POST $data = $_POST; // Пользователь нажимает на кнопку "Зарегистрировать" и код начинает выполняться if(isset($data['do_signup'])) { // Регистрируем // Создаем массив для сбора ошибок $errors = array(); // Проводим проверки // trim — удаляет пробелы (или другие символы) из начала и конца строки if(trim($data['login']) == '') { $errors[] = "Введите логин!"; } if(trim($data['email']) == '') { $errors[] = "Введите Email"; } if(trim($data['name']) == '') { $errors[] = "Введите Имя"; } if(trim($data['family']) == '') { $errors[] = "Введите фамилию"; } if($data['password'] == '') { $errors[] = "Введите пароль"; } if($data['password_2'] != $data['password']) { $errors[] = "Повторный пароль введен не верно!"; } // функция mb_strlen - получает длину строки // Если логин будет меньше 5 символов и больше 90, то выйдет ошибка if(mb_strlen($data['login']) < 5 || mb_strlen($data['login']) > 90) { $errors[] = "Недопустимая длина логина"; } if (mb_strlen($data['name']) < 3 || mb_strlen($data['name']) > 50){ $errors[] = "Недопустимая длина имени"; } if (mb_strlen($data['family']) < 5 || mb_strlen($data['family']) > 50){ $errors[] = "Недопустимая длина фамилии"; } if (mb_strlen($data['password']) < 2 || mb_strlen($data['password']) > 8){ $errors[] = "Недопустимая длина пароля (от 2 до 8 символов)"; } // проверка на правильность написания Email if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $data['email'])) { $errors[] = 'Неверно введен е-mail'; } // Проверка на уникальность логина if(R::count('users', "login = ?", array($data['login'])) > 0) { $errors[] = "Пользователь с таким логином существует!"; } // Проверка на уникальность email if(R::count('users', "email = ?", array($data['email'])) > 0) { $errors[] = "Пользователь с таким Email существует!"; } if(empty($errors)) { // Все проверено, регистрируем // Создаем таблицу users $user = R::dispense('users'); // добавляем в таблицу записи $user->login = $data['login']; $user->email = $data['email']; $user->name = $data['name']; $user->family = $data['family']; // Хешируем пароль $user->password = password_hash($data['password'], PASSWORD_DEFAULT); // Сохраняем таблицу R::store($user); echo '<div style="color: green; ">Вы успешно зарегистрированы! Можно <a href="login.php">авторизоваться</a>.</div><hr>'; } else { // array_shift() извлекает первое значение массива array и возвращает его, сокращая размер array на один элемент. echo '<div style="color: red; ">' . array_shift($errors). '</div><hr>'; } }
Как видите наша регистрация безопасна на 100% т.к. есть множество различных проверок и хеширование пароля. Зарегистрировать двух пользователей с одинаковым логином и Email невозможно. Вы можете добавить и другие проверки при регистрации.
6. Обработка формы авторизации
В файле “login.php” после подключения файла с базой данных пишем код описанный ниже. Чтобы понять код читайте комментарии к нему. Листинг:
// Создаем переменную для сбора данных от пользователя по методу POST $data = $_POST; // Пользователь нажимает на кнопку "Авторизоваться" и код начинает выполняться if(isset($data['do_login'])) { // Создаем массив для сбора ошибок $errors = array(); // Проводим поиск пользователей в таблице users $user = R::findOne('users', 'login = ?', array($data['login'])); if($user) { // Если логин существует, тогда проверяем пароль if(password_verify($data['password'], $user->password)) { // Все верно, пускаем пользователя $_SESSION['logged_user'] = $user; // Редирект на главную страницу header('Location: index.php'); } else { $errors[] = 'Пароль неверно введен!'; } } else { $errors[] = 'Пользователь с таким логином не найден!'; } if(!empty($errors)) { echo '<div style="color: red; ">' . array_shift($errors). '</div><hr>'; } }
Про работу $_SESSION можно почитать в нашей статье “Cookie и отслеживание сеанса“.
7. Создание главного файла приложения
Все формы и обработчики форм мы написали, а теперь создадим главный файл где будет отображаться приветствие пользователя, когда он будет авторизован. Файл назовём “index.php”. Листинг:
<?php $title="Главная страница"; // название формы require __DIR__ . '/header.php'; // подключаем шапку проекта require "db.php"; // подключаем файл для соединения с БД ?> <div class="container mt-4"> <div class="row"> <div class="col"> <center> <h1>Добро пожаловать на наш сайт!</h1> </center> </div> </div> </div> <!-- Если авторизован выведет приветствие --> <?php if(isset($_SESSION['logged_user'])) : ?> Привет, <?php echo $_SESSION['logged_user']->name; ?></br> <!-- Пользователь может нажать выйти для выхода из системы --> <a href="logout.php">Выйти</a> <!-- файл logout.php создадим ниже --> <?php else : ?> <!-- Если пользователь не авторизован выведет ссылки на авторизацию и регистрацию --> <a href="login.php">Авторизоваться</a><br> <a href="signup.php">Регистрация</a> <?php endif; ?> <?php require __DIR__ . '/footer.php'; ?> <!-- Подключаем подвал проекта -->
Дизайн главной страницы если пользователь не авторизован:

Дизайн главной страницы если пользователь авторизован:

Теперь создадим последний файл в нашем проекте и назовём его “logout.php”. Он необходим для удаления сессии пользователя, когда он авторизован. Листинг файла:
<?php require __DIR__ . '/header.php'; // подключаем шапку проекта require "db.php"; // подключаем файл для соединения с БД // Производим выход пользователя unset($_SESSION['logged_user']); // Редирект на главную страницу header('Location: index.php'); require __DIR__ . '/footer.php'; // Подключаем подвал проекта ?>
После этого можно запустить страничку в браузере и проверить результат работы. Если Вы правильно записали, тогда все должно работать идеально, но если есть ошибки значит проверьте правильность кода.
Структура проекта в виде дерева:

На этом мы заканчиваем создание системы регистрации и авторизации на PHP. В комментариях жду Ваших предложений по доработке этого приложения. Удачи в разработке!
45 ответов к “Создание системы регистрации и авторизации на PHP”
Всё хорошо , статья годная но вот после авторизации ничего не происходит , форма просто обнуляется без каких либо алертов , в случае не правиьно заполненных данных на авторизацию ошибка выходит , но вот если ввести правильно то просто ничего не происходит , код проверил с помощь. ctrl+c ctrl+v
Спасибо за ваш комментарий. Я посмотрел весь код и еще раз по сайту создал эту систему на работе и все работает нормально, но я использую локальный сервер XAMPP (версия php 7.4).
Я посмотрел ваш проект. Вам нужно посмотреть внимательно файл “login.php”.
Если пользователь ввел данные, код проверяет их с БД и перенаправляет на страницу “index.php”. Вот строчка:
// Редирект на главную страницу
header(‘Location: index.php’);
Исходя из того, что вы делаете все это на хостинге прошу посмотреть эту строчку и глянуть отрабатывается ли этот строчка.
В своем коде я уверен на 100% т.к. я делал его на XAMPP и еще проверял код на работе на сервере. У меня на работе есть свой хостинг и там все отлично тоже работает.
Если что изменится, отпишитесь. Будем ждать.
u menya toje takie prablemi ne rabotaet vezde sessions i pokazivaet warning . no posle registratsiya kogda nado avtorizovatsa ne proxodit v index,php prosta pokazivaet awipku o
header(‘Location: index.php’);
Хостинг поддерживает максимальную версию PHP 7.2 , возможо в этом проблема , потому что код проверил , всё как у вас , а редиректа не происходит
Версия php здесь не играет роль. Я проверял с версией 7.3 и 7.2. В хостинге проблема. Он бесплатный я так понимаю. Проверьте на локальном сервере (XAMPP или OpenServer). Библиотека redbeanphp требует php от 5 и выше и все.
RB работает точно , так как пользователь заносится в таблицу , буду искать что не работает , попробую на XAMPP , спасибо.
На XAMPP заработало , директ заработал теперь после авторизации перекидывает на index.php
Отлично))
Если будет возможность посмотрите на других хостингах. Возможно проблема в этом. Бесплатные хостинги ограничены бывают.
Очень полезная статья. Я сейчас в процессе обучения. Перепробовал массу вариантов и потратил не мало времени, но ваш вариант регистрации и авторизации для меня самый подходящий. Потратил примерно около часа времени. Все работает четко. ОГРОМНОЕ СПАСИБО!
Рады помочь!))
Здравствуйте статья отлична,но почему нет подробного описания,что будет происходить в phpmyadmin (с картинками.)
Здравствуйте, в 1 пункте я написал что нужно создать БД и все остальное делаем уже в коде. Поэтому я и не стал добавлять скрины phpMyAdmin.
session_start(); // Создаем сессию для авторизации
I have problems with it
Warning: session_start(): Cannot send session cache limiter – headers already sent
Ошибка говорит о том, что функция не может установить заголовки ответа HTTP, так как уже был вывод данных в тело ответа.
Функция header (которую в свою очередь вызывает session_start) может использоваться только до вывода тела ответа.
Можно ли используя данный метод сохранить пользователя к примеру на год?
Нужно отдельно делать скрипт для того чтобы удалял пользователей из базы данных по различным срокам.
Здравствуйте, спасибо за статью, 15 минут и все работает прекрасно, хотел бы у вас спросить, есть ли подобная статья, чтоб после этой самой регистрации, пользователи могли оставлять комменты (только зареганые и авторизованые) и как сделать чтоб они ходили по страницам и им показывался контент, скрытый от незарегистрированных юзеров.
На нашем проекте, только есть статья: https://it-black.ru/sozdanie-stranicy-oprosa-kachestva-predostavljaemyh-uslug-na-php
Больше нету ничего
С этим способом подключения, который на данной странице, не будет работать? нужно новое подключение к бд делать?
Добрая ночь. Друзья, что делать. Как подключить базу? Вроде сказано, что она будет без подключений и т.д и т.п, но вроде ничего нету? Может кто помочь? Ссылка на ВК – https://vk.com/mark1l0ff
Добрый день. А подскажите, как долго “живет” сессия? При каких условиях происходит разлогинивание? Возможно ли указывать на сколько разрешен вход? Нет ли необходимости к паролю добавлять “соль”, допустим IP?
Добрый день! Сессия живет стандартно 60 мин. Разлогинирование пользователя происходит просто удаляется сессия и все. Указать можно. Надо просто чуток поменять код. Насчет соли это уже на усмотрение, но лучше сделать конечно. Данный вариант сыроват и требует доработки со стороны безопасности для применения на практике.