Регистрация и Авторизация на PHP + MySQL
Доброго времени суток друзья! Давай с Вами рассмотрим регистрацию пользователей на PHP. Для начала давайте определим условия для нашей регистрации пользователей:
Условия для регистрации пользователей
- Пароль шифруем при помощи алгоритма MD5
- Пароль будем «солить»
- Проверка на занятость Логина
- Активация пользователя письмом.
- Запись и хранение данных в СУБД MySQL
Для написание данного скрипта нам нужно понять, что такое регистрация пользователя. Регистрация пользователя – это получения данных реального пользователя, обработка и хранение данных.
Если объяснять простыми словами то регистрация это всего лишь запись и хранение определенных данных по которым мы можем авторизировать пользователя в нашем случае – это Логин и Пароль.
Авторизация — предоставление определённому лицу или группе лиц прав на выполнение определённых действий, а также процесс проверки данных прав при попытке выполнения этих действий. Проше говоря с помощью авторизации мы можем разграничить доступ к тому или иному контенту на нашем сайте.

Рассмотрим структуру каталогов скриптов для реализации нашей регистрации с авторизацией. Нам нужно разбить скрипты на логические составляющие. Модули регистрации и авторизации мы поместив в отдельный каталог. Так же в отдельные каталоги мы поместим подключение к базе данных MySQL, файл с пользовательскими функциями, файл стилей CSS и наш шаблон HTML. Данная структура позволяет быстро ориентироваться в скриптах. Представьте себе, что у Вас большой сайт с кучей модулями и т.д. и если не будет порядка, то будет очень сложно что-то отыскать в таком бардаке.
Так как мы будем хранить все данные в СУБД MySQL, то давайте создадим не большую таблицу в которой будем хранить данные о регистрации.
Для начала нужно создать таблицу в базе данных. Таблицу назовем bez_reg где bez – это префикс таблицы, а reg название таблицы.
Структура таблицы: bez_reg
-- -- Структура таблицы `bez_reg` -- CREATE TABLE IF NOT EXISTS `bez_reg` ( `id` int(11) NOT NULL AUTO_INCREMENT, `login` varchar(200) NOT NULL, `pass` varchar(32) NOT NULL, `salt` varchar(32) NOT NULL, `active_hex` varchar(32) NOT NULL, `status` int(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Теперь создадим основные скрипты для дальнейшей работы.
Файл INDEX.PHP
//Получаем данные с буфера $content = ob_get_contents(); ob_end_clean(); //Подключаем наш шаблон include './html/index.html'; ?>
Файл CONFIG.PHP
//Адрес базы данных define('BEZ_DBSERVER','localhost'); //Логин БД define('BEZ_DBUSER',''); //Пароль БД define('BEZ_DBPASSWORD',''); //БД define('BEZ_DATABASE',''); //Префикс БД define('BEZ_DBPREFIX','bez_'); //Errors define('BEZ_ERROR_CONNECT','Немогу соеденится с БД'); //Errors define('BEZ_NO_DB_SELECT','Данная БД отсутствует на сервере'); //Адрес хоста сайта define('BEZ_HOST','http://'. $_SERVER['HTTP_HOST'] .'/'); //Адрес почты от кого отправляем define('BEZ_MAIL_AUTOR','Регистрация на http://bezramok-tlt.ru '); ?>
Файл 404.HTML
Ошибка 404 Ошибка 404
На странице произошла ошибка 404
Вернуться
Файл BD.PHP
//Соединение с БД MySQL $db_connect = mysql_connect( BEZ_DBSERVER, BEZ_DBUSER, BEZ_DBPASSWORD ) or die(BEZ_ERROR_CONNECT); define('BEZ_CONNECT', $db_connect); mysql_select_db( BEZ_DATABASE, BEZ_CONNECT )or die(BEZ_NO_DB_SELECT); //Устанавливаем кодировку UTF8 mysql_query ("SET NAMES utf8"); mysql_query ("set character_set_client='utf8'"); mysql_query ("set character_set_results='utf8'"); mysql_query ("set collation_connection='utf8_general_ci'"); ?>
Файл INDEX.HTML
Файл FUNCT.PHP
Давайте приступим к написанию регистрации. Для начала нам нужно будет сделать шаблон формы регистрации, чтобы пользователь смог внести свои данные для обработки. Далее нам нужно будет написать сам обработчик формы, который проверит на корректность введенные данные пользователя. После того как данные успешно проверенны записываем их в нашу базу данных и отправляем письмо пользователю для активации его аккаунта.
Файл REG.PHP
//Выводим сообщение об удачной регистрации if(isset($_GET['status']) and $_GET['status'] == 'ok') echo 'Вы успешно зарегистрировались! Пожалуйста активируйте свой аккаунт!'; //Выводим сообщение об удачной регистрации if(isset($_GET['active']) and $_GET['active'] == 'ok') echo 'Ваш аккаунт на http://bezramok-tlt.ru успешно активирован!'; //Производим активацию аккаунта if(isset($_GET['key'])) < //Проверяем ключ $sql = 'SELECT * FROM `'. BEZ_DBPREFIX .'reg` WHERE `active_hex` = "'. escape_str($_GET['key']) .'"'; $res = mysqlQuery($sql); if(mysql_num_rows($res) == 0) $err[] = 'Ключ активации не верен!'; //Проверяем наличие ошибок и выводим пользователю if(count($err) >0) echo showErrorMessage($err); else < //Получаем адрес пользователя $row = mysql_fetch_assoc($res); $email = $row['login']; //Активируем аккаунт пользователя $sql = 'UPDATE `'. BEZ_DBPREFIX .'reg` SET `status` = 1 WHERE `login` = "'. $email .'"'; $res = mysqlQuery($sql); //Отправляем письмо для активации $title = 'Ваш аккаунт на http://bezramok-tlt.ru успешно активирован'; $message = 'Поздравляю Вас, Ваш аккаунт на http://bezramok-tlt.ru успешно активирован'; sendMessageMail($email, BEZ_MAIL_AUTOR, $title, $message); /*Перенаправляем пользователя на нужную нам страницу*/ header('Location:'. BEZ_HOST .'less/reg/?mode=reg&active=ok'); exit; >> /*Если нажата кнопка на регистрацию, начинаем проверку*/ if(isset($_POST['submit'])) < //Утюжим пришедшие данные if(empty($_POST['email'])) $err[] = 'Поле Email не может быть пустым!'; else < if(!preg_match("/^[a-z0-9_.-]+@([a-z0-9]+\.)+[a-z]$/i", $_POST['email'])) $err[] = 'Не правильно введен E-mail'."\n"; > if(empty($_POST['pass'])) $err[] = 'Поле Пароль не может быть пустым'; if(empty($_POST['pass2'])) $err[] = 'Поле Подтверждения пароля не может быть пустым'; //Проверяем наличие ошибок и выводим пользователю if(count($err) > 0) echo showErrorMessage($err); else < /*Продолжаем проверять введеные данные Проверяем на совподение пароли*/ if($_POST['pass'] != $_POST['pass2']) $err[] = 'Пароли не совподают'; //Проверяем наличие ошибок и выводим пользователю if(count($err) >0) echo showErrorMessage($err); else < /*Проверяем существует ли у нас такой пользователь в БД*/ $sql = 'SELECT `login` FROM `'. BEZ_DBPREFIX .'reg` WHERE `login` = "'. escape_str($_POST['email']) .'"'; $res = mysqlQuery($sql); if(mysql_num_rows($res) >0) $err[] = 'К сожалению Логин: '. $_POST['email'] .' занят!'; //Проверяем наличие ошибок и выводим пользователю if(count($err) > 0) echo showErrorMessage($err); else < //Получаем ХЕШ соли $salt = salt(); //Солим пароль $pass = md5(md5($_POST['pass']).$salt); /*Если все хорошо, пишем данные в базу*/ $sql = 'INSERT INTO `'. BEZ_DBPREFIX .'reg` VALUES( "", "'. escape_str($_POST['email']) .'", "'. $pass .'", "'. $salt .'", "'. md5($salt) .'", 0 )'; $res = mysqlQuery($sql); //Отправляем письмо для активации $url = BEZ_HOST .'less/reg/?mode=reg&key='. md5($salt); $title = 'Регистрация на http://bezramok-tlt.ru'; $message = 'Для активации Вашего акаунта пройдите по ссылке '. $url .''; sendMessageMail($_POST['email'], BEZ_MAIL_AUTOR, $title, $message); //Сбрасываем параметры header('Location:'. BEZ_HOST .'less/reg/?mode=reg&status=ok'); exit; > > > > ?>
Файл REG_FORM.HTML
Регистрация пользователей PHP MySQL с активацией письмом
Поля со значком * обязательны для заполнения
Так как регистрация пользователей у нас готова, самое время написать авторизацию. Создадим форму для авторизации пользователей, далее напишем обработчик формы авторизации и на последок сделаем скрипт show.php который будет показывать нам авторизированны мы в системе или нет.
Файл AUTH.PHP
//Если нажата кнопка то обрабатываем данные if(isset($_POST['submit'])) < if(empty($_POST['email'])) $err[] = 'Не введен Логин'; if(empty($_POST['pass'])) $err[] = 'Не введен Пароль'; //Проверяем наличие ошибок и выводим пользователю if(count($err) >0) echo showErrorMessage($err); else < /*Создаем запрос на выборку из базы данных для проверки подлиности пользователя*/ $sql = 'SELECT * FROM `'. BEZ_DBPREFIX .'reg` WHERE `login` = "'. escape_str($_POST['email']) .'" AND `status` = 1'; $res = mysqlQuery($sql); //Если логин совподает, проверяем пароль if(mysql_num_rows($res) >0) < //Получаем данные из таблицы $row = mysql_fetch_assoc($res); if(md5(md5($_POST['pass']).$row['salt']) == $row['pass']) < $_SESSION['user'] = true; //Сбрасываем параметры header('Location:'. BEZ_HOST .'less/reg/?mode=auth'); exit; >else echo showErrorMessage('Неверный пароль!'); > else echo showErrorMessage('Логин '. $_POST['email'] .' не найден!'); > > ?>
Файл AUTH_FORM.HTML
Введите свой Логин и Пароль для входа!
Файл SHOW.PHP
//Проверяем зашел ли пользователь if($user === false) echo 'Доступ закрыт, Вы не вошли в систему!
'."\n"; if($user === true) echo 'Поздравляю, Вы вошли в систему!
'."\n"; ?>
Автор не несет ответственности за использования данных скриптов у себя на сайте. Вы можете их использовать на свой страх и риск!
Для тех у кого последняя версия PHP выкладываю данный скрипт с использованием PDO т.к. расширение MySQL устарело и было удалено из новой версии PHP. Скачать регистрация и авторизация php mysql pdo
Архив обновлен 24.02.2015г.
Внимание: Если вы используете данный скрипт на локальном сервере типа DENWER, XAMPP, то не стоит ждать писем на свой почтовый ящик. Письма лежат в заглушке sendmail. В Denwer вы их можете найти по пути Z:\tmp\!sendmail\ открыть данные файлы вы сможете в любом почтовом клиенте.
Простая авторизация через базу данных на PHP
Давайте реализуем самую простую авторизацию на базе данных, пока без регистрации. Вместо регистрации пользователей, мы просто вобьем их логины и пароли в таблицу в базе данных:
| id | login | password |
|---|---|---|
| 1 | user | 12345 |
| 2 | admin | 123 |
Сделаем теперь форму, в которую будут вбиваться логин и пароль:
Напишем теперь код, который будет проверять, отправлена ли форма и, если отправлена, то проверять, есть ли в базе данных пользователь с таким логином и паролем:
Реализуйте описанную выше авторизацию. Сделайте так, чтобы, если пользователь прошел авторизацию — выводилось сообщение об этом, а если не прошел — то сообщение о том, что введенный логин или пароль вбиты не правильно.
Модифицируйте код так, чтобы в случае успешной авторизации форма для ввода пароля и логина не показывалась на экране.
Модифицируйте код так, чтобы в случае успешной авторизации происходил редирект на страницу index.php .
Модифицируйте код так, чтобы на странице index.php выводилось сообщение об успешной авторизации. Решите задачу через флеш-сообщения на сессиях.
Простая авторизация на php и mysql, очень простая!
В базе данных таблица с двумя строками: id, user, password.
На странице есть два поля для ввода (имени и пароля) и кнопка входа.
По нажатию кнопки данные из двух полей для ввода должны как бы пройти проверку на соответствие одной из пар «user-password».
Как это сделать? Языка не знаю и знать не хочу, но надо сделать домашнее задание. Пожалуйста, дайте самый простой способ.
К базе данных подключился.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Простая авторизация через форму html на сайт php
У меня есть сайт на php и форма на html. В форму я ввожу логин и пароль если данные верны то.
PHP+MySQL Простая Фотогалерея
Мне нужно сделать очень простую фотогалерею на PHP и MySQL. В центре фотография, справа и слева.
Простая корзина товаров PHP + mysql
Здравствуйте. Прошу помощи в создании очень простой корзины товаров. Есть вывод товаров с базы.
Простая авторизация и сессии
Имеется форма, которая выглядит следующим образом: <form action="index.php" method="post">.
Аутентификация пользователя
Часто сайты должны уметь идентифицировать своих посетителей, чтобы сохранять и показывать им позже какую-либо информацию.
Например, интернет-магазины могут сохранять историю просмотров, чтобы рекомендовать потенциальным покупателям наиболее подходящие им товары. Или агрегатор новостей мог бы предложить пользователям выбирать только интересующие их рубрики.
К счастью HTTP и все браузеры предоставляют возможность сохранения информации о пользователе.
Cookies
Cookies (в дальнейшем просто «куки») — небольшие фрагменты данных, которые веб-сервер отправляет браузеру. Браузер сохраняет их у себя, а при следующем посещении веб-страницы отправляет обратно. Благодаря этому, веб-сервер сможет узнать своего «старого» посетителя.
С технической стороны, куки — это обычные HTTP-заголовки.
Когда веб-сервер хочет записать куку в браузер пользователя, он отсылает специальный заголовок ответа с названием Set-Cookie . В этом заголовке должна содержаться необходимая информация и дополнительные аттрибуты, о которых пойдёт речь далее.
В следующий раз, когда браузер пользователя запросит веб-страницу с того же сайта, в числе прочих заголовков браузер передаёт заголовок запроса Cookie . Веб-сервер получит эту информацию, и она будет доступна также и для PHP.
Как установить куки: функция setcookie
Задача очень проста: сохранять и показывать посетителю страницы, сколько раз он посетил наш сайт. Для этого будем сохранять количество посещений в отдельной куке, увеличивая значения на единицу при каждой загрузке страницы.
PHP может управлять заголовками, которые отправляет сервер, а значит, может устанавливать и читать куки.
Чтобы добавить новую куку, необходимо вначале определиться со следующими критериями:
- Название куки (может состоять только из символов латинского алфавита и цифр);
- Значение, которое предполагается хранить;
- Срок жизни куки — это обязательное условие.
За установку куки в PHP отвечает функция setcookie , ей нужно передать как минимум три параметра, описанных выше. Пример:
Обратите внимание, что срок жизни указывается относительно текущей даты. В этом примере кука будет существовать ровно 30 дней с момента установки.
Как прочитать куки
В PHP максимально упрощён процесс чтения информации из cookies. Поэтому все переданные сервером куки доступны в специальном глобальном массиве $_COOKIE .
Так, чтобы получить содержимое куки с именем visit_count , достаточно обратиться к одноимённому элементу массива $_COOKIE , например, вот так:
Обратите внимание: установив в сценарии куку через setcookie , прочитать её можно будет только при следующем посещении страницы.
Собираем всё вместе
Теперь, научившись устанавливать и читать куки, напишем полноценный сценарий, который будет считать и выводить количество посещений страницы пользователем:
setcookie("visit_count", $visit_count, strtotime("+30 days")); print("Количество посещений: " . $visit_count); ?>
Сессии
Мы уже умеем сохранять информацию для пользователя между посещениями страницы с помощью кук. Но зачем нам ещё и сессии?
Сессии, они же сеансы, это, по сути, просто удобная обёртка над куками. Они также позволяют хранить данные пользователя, но с некоторыми отличиями и ограничениями:
- Данные хранятся не произвольное время, а только до закрытия вкладки с веб-страницей.
- Чтобы сессии работали, в начале каждого сценария надо вызывать функцию session_start() .
- Доступный объём для хранения информации намного больше.
Запись и чтение информации при использовании сессий выглядит просто как работа со специальным массивом $_SESSION .
Как устроены сессии
- PHP генерирует уникальный идентификатор браузера.
- Идентификатор сохраняется в специальную куку и передаётся с каждым запросом.
- Все данные, которые записываются в сессию, PHP автоматически сохраняет в специальном файле на сервере.
Благодаря существованию сессий в PHP мы можем сохранять любые данные так же просто, как присваивать их переменным. Но, в отличие от переменных, эти данные будут сохраняться для пользователя между запросами в пределах сеанса.
Перепишем сценарий для подсчета посещений, но теперь используем сессии:
$_SESSION["visit_count"] = $visit_count; print("Количество посещений: " . $visit_count); ?>
Аутентификация
Представим интернет-магазин. Все его страницы можно разделить на две половины: публичные и приватные.
К публичным относятся страницы каталога, информации о товаре, условия доставки и так далее. К приватным — корзина покупок, история заказов. Совершенно очевидно, что корзина покупок у каждого покупателя должна быть своя, а иметь к ней доступ должен только сам владелец и никто больше.
Проверка доступа пользователей к сайту и называется аутентификацией. Весь процесс аутентификации всегда состоит из нескольких шагов:
- При попытке доступа к закрытой части сайта, пользователь видит форму ввода логина и пароля.
- Форма отправляется, а полученные данные сравниваются с действительным логином и паролем существующего пользователя.
- Если данные совпадают, то пользователь считается аутентифицированным и получает доступ к приватной части сайта.
- При повторном открытии этой страницы пользователь не должен повторно вводить пароль, если он уже делал это в рамках текущего сеанса.
Отличие аутентификации и авторизации
Следует различать два термина: аутентификация и авторизация.
Аутентификация — проверка подлинности предоставленного пользователем идентификатора (пара логин-пароль).
Авторизация — процесс проверки и предоставления прав пользователю на выполнение определённого действия.
В примере с интернет-магазином аутентификация выполняется, когда пользователь заполняет форму входа и попадает в свой личный кабинет. Сценарий, обрабатывающий форму, лишь проверяет, что такой пользователь существует, и его пароль совпадает.
Авторизация включается в работу, когда пользователь выполняет какое-нибудь действие. Например, удаляет товар из своей корзины. Во время этого действия сценарий должен проверить принадлежность товара к корзине этого пользователя. Без такой проверки пользователь мог бы удалить товар из чужой корзины.
Логика авторизации намного сложнее, чем простая проверка совпадения почты и пароля при входе на сайт. В авторизацию могут также входить следующие понятия: группы пользователей, виды действий, ресурсы, иерархия ролей и действий. Этой теме можно посвятить отдельную главу, но в рамках этого учебника мы не рассматриваем эту тему.
Использование сессии для контроля доступа
Сессии чаще всего используются для хранения информации о залогиненном пользователе.
Принцип работы простой: внутри сценария, ответственного за обработку формы входа, открывается новая сессия, куда записывается информация о вошедшем пользователе. Такой информацией может быть ассоциативный массив со всеми значениями из соответствующей записи из базы данных.
Затем добавим код, проверяющий существование сессии в сценарии, который должен быть закрыт от анонимных пользователей.
Если сессия пуста, значит, пользователь не выполнял вход на сайт и доступа к данной странице не имеет. В этом случае можно вернуть код ответа 403 и показать сообщение об ошибке, либо принудительно выполнить переадресацию на главную страницу.
Выход с сайта. Как закрыть сессию
Если на сайте есть вход, то должен быть и выход. Таким выходом будет специальный сценарий, который очистит сессию и переадресует на главную страницу.
Чтобы очистить сессию, достаточно очистить массив $_SESSION : $_SESSION = []
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
