Продолжаем изучать язык PHP на практике. Тема нашего сегодняшнего урока — «Простая форма авторизации на PHP». Я предлагаю вам подробное описание создания формы авторизации, регистрации и обработчиков файлов с пошаговой инструкцией.
Перед тем, как приступить к работе, мы должны продумать логику построения и работы нашей формы, чтобы потом воплотить её в жизнь средствами языка программирования, в нашем случае — средствами php.
Техническое задание
Итак, для этого нам нужна форма заполнения данных для входа в систему, на которой мы заполняем поля «логин», «пароль»и нажимаем кнопку «Войти», при нажатии которой подключается обработчик, который проверяет эти поля и если они совпадают с существующими в базе (то бишь осуществляется проверка, зарегистрирован ли такой зарегистрирован пользователь в системе), то нам показывается сообщение «Бла-бла-бла, вы зашли на сайт, поздравляем!», форма входа пропадает, а вместо неё появляется кнопка «Закрыть».
Также на форме входа есть ссылка «Регистрация» для тех пользователей, которые ещё не зарегистрировались, но очень хотят это сделать. При клике на эту ссылку мы попадаем уже на третий файл, который отвечает именно за регистрацию пользователей. В этом файле нам нужно прописать поля «Логин», «Пароль», «Повторите пароль», «Email» и кнопка «ОК», при нажатии которой подключается четвёртый файл — обработчик, который заносит заполненные поля в специальную таблицу Базы Данных, осуществляя при этом проверку, заполнены ли все поля.
Список файлов:
- vhod.php — форма входа/авторизации
- script1.php — обработчик формы авторизации
- registration.php — форма регистрации
- script2.php — обработчик формы регистрации
- сlose.php — обработчик кнопки «Выйти»
Форма авторизации
Помещение HTML-формы в PHP-скрипт
Поля формы авторизации создаются средствами языка разметки HTML, но нам необходимо поместить эту форму в PHP-скрипт, чтобы у нас была возможность работать с php-скриптами прямо в этой форме. Для этого форму заключим в php-скрипт, а выведем её на экраны средствами php, например,
<?php echo "<form id='forma' action='script1.php' method='post'> <h1>Форма входа</h1> <p>Заполните поля для входа на сайт</p> <p>Логин<br /><input type='text' name='login'></p> <p>Пароль<br /><input type='password' name='password'></p> <p><input type='submit' name='submit' value='Войти'> <br></p></form>" ?>
Подключение обработчика формы
Для того, чтобы форма начала работать и данные с полей формы сверялись с данными в Базе Данных, которые были введены при регистрации, нам нужно форму авторизации подключить к обработчику, который и будет обрабатывать форму, сверять значения полей, запускать или не запускать пользователей на сайт. Подключается обработчик легко, нужно всего лишь прописать в теге form атрибут action, то бишь ссылку на обработчик (адрес документа или программы, которая будет обрабатывать данную форму), например:
<form id='forma' action='script1.php' method='post'>
Кнопка «Войти» (type='submit') отправляет данные на страничку обработчика формы — script1.php. Например:
<input type='submit' name='submit' value='Войти'>
Вся процедура нахождения пользователя на сайте работает на сессиях. Именно в сессии хранятся данные пользователя, пока он находится на сайте. Запускается сессия в начале странички, можно сразу после открытия php-скрипта, например:
<?php session_start();
Приветствие пользователя
По поставленному техническому заданию, нам нужно, чтобы в первом файле vhod.php показывалось авторизован ли пользователь на сайте. Для этого мы прописываем проверку, которая сверяет id и логин пользователя и если сессия для этого пользователя открыта, то появится запись, что, например, «Вы вошли на сайт, как test1». Форма входа при этом пропадёт и появится кнопка «Закрыть». Если сессия не открыта (то бишь значения id и логин в сессии пусты), появится запись «Вы вошли на сайт, как гость». При этом появится форма входа и ссылка на форму регистрации пользователей. Пример:
if(isset($_SESSION['login'])) {$login='Здравствуйте, '.$_SESSION['login'].'!';} // Проверяем, пусты ли переменные логина и id пользователя if (empty($_SESSION['login']) or empty($_SESSION['id'])) // Если пусты, то { echo "<p style='margin-left:60px;'>Вы вошли на сайт, как гость</p> <br> HTML-форма входа<br />Ссылка на форму регистрации"; } else // Если не пусты, то { echo "<br /><br />Вы вошли на сайт, как ".$_SESSION['login']."<br><br />"; echo ('Кнопка ВЫЙТИ'); }
Кнопка ВЫЙТИ
Если пользователь авторизован и находится на сайте, обязательно нужно прописать кнопку «Выйти», при нажатии на которую должно происходить удаление, полное уничтожение данной сессии, чтобы никто не смог работать под ней больше до следующей авторизации. За удаление сессии отвечает встроенная (базовая) функция session_destroy();
В одном файле vhod.php у меня не получилось прописать функцию удаления сессии по клику, то бишь, по нажатию кнопки «Выйти», поэтому пришлось для работы кнопки ВЫЙТИ прописать для неё отдельный скрипт в отдельном файле close.php Для этого мы просто создаём html-форму с одной кнопкой «Выйти», в атрибуте action прописываем ссылку на обработчик этой кнопки, на файл close.php (пример выше уже был указан). А вот в файле-обработчике прописываем закрытие сессии по логину и дальнейшее её полное уничтожение. Пример:
unset($_SESSION['login']);//закрытие сессии по логину session_destroy();//удаление сессии
Полностью файл close.php имеет такую структуру:
<?php session_start();//открытие сессии unset($_SESSION['login']);//закрытие сессии по логину session_destroy();//удаление сессии header("Location: http://lora.in.ua/php-uroki/avtorizaciya/vhod.php");//Перенаправление на эту страницу после нажатия кнопки ВЫЙТИ ?>
Файл авторизации
Соединим все нужные нам формы, функции и получим файл авторизации vhod.php. Полностью он выглядит так:
<?php // Заключаем форму в php-скрипт для возможности прописівать скрипты прямо в этом файле // вся процедура работает на сессиях. В сессии хранятся данные пользователя, пока он находится на сайте. Запускается сессия в начале странички session_start(); echo " <html> <head> <link rel='stylesheet' type='text/css' href='style.css' /> <title>Форма входа на PHP</title> </head><body>"?> <?php if(isset($_SESSION['login'])) {$login='Здравствуйте, '.$_SESSION['login'].'!';} // Проверяем, пусты ли переменные логина и id пользователя if (empty($_SESSION['login']) or empty($_SESSION['id'])) // Если пусты, то { echo "<p style='margin-left:60px;'>Вы вошли на сайт, как гость</p><br> <!--Подключение обработчика формы--><form id='forma' action='script1.php' method='post'> <h1>Форма входа</h1> <p>Заполните поля для входа на сайт</p> <p>Логин<br /><input type='text' name='login'></p> <p>Пароль<br /><input type='password' name='password'></p> <p><input type='submit' name='submit' value='Войти'> <!--**** Кнопка (type='submit') отправляет данные на страничку script1.php ***** --> <br></p></form><p style='margin-left:60px;'><a href='registration.php'>Регистрация</a></p>"; } else // Если не пусты, то { echo "<br /><br />Вы вошли на сайт, как ".$_SESSION['login']."<br><br />"; echo ('<form action="close.php" method="POST"> <input type="submit" value="Выход"/> </form>'); } echo" </body></html>"; ?>
Обработчик формы авторизации
Чтобы наша форма авторизации работала, то есть взаимодействовала с Базой Данных, мы подключили специальный обработчик script1.php. Именно он проверит введены ли данные в поля авторизации — «Логин» и «Пароль», зарегистрирован ли на сайте пользователь с введёнными параметрами (то бишь, есть ли в БД уже такой пользователь), и если есть, авторизовать его на сайте (если совпадают введённые логин и пароль с существующими в БД). Если такого пользователя нет (не совпадают введённые данные логин и пароль), вывести пользователю эту ошибку.
Для начала нам нужно проверить правильность заполнения форм входа пользователя. Проверяем, заполнены ли пользователем все поля, удаляем экранирование символов, удаляем лишние пробелы, преобразуем символы в html-сущности, открываем сессию и перенаправляем пользователя на нужную страницу после выполнения скрипта. Например:
session_start();//вся процедура сверки логина и паролей работает на сессиях. Именно в них хранятся данные пользователя, пока он находится на сайте. Запускать сессию нужно в начале странички header('Refresh: 5; URL=http://lora.in.ua/php-uroki/avtorizaciya/vhod.php'); //redirect с задержкой echo 'Вы будете перенаправлены на главную страницу через 5 секунд.'; //вывод сообщения if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }//заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную if (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаём ошибку и останавливаем выполнение скрипта { exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); } $login = stripslashes($login);//удаляет экранирование символов, произведенное функцией addslashes() $login = htmlspecialchars($login);//преобразует специальные символы в HTML-сущности (обрабатываем их, чтобы теги и скрипты не работали на случай от действий умников-спамеров) $password = stripslashes($password); //удаляет экранирование символов, произведенное функцией addslashes() $password = htmlspecialchars($password); $login = trim($login);//удаляет пробелы (или другие символы) из начала и конца строки $password = trim($password);
Ну и, конечно же, нам нужно подключиться к базе данных, чтобы наши скрипты проверки пользователя и его авторизации могли работать. Чтобы подключиться к БД, нужно знать адрес сервера MySQL (mysql.moidomen.com), название базы данных (moya_baza), название пользователя базы данных (moi_login) и пароль к базе данных (moi_parol). В скобках и в примере ниже я указала примерные данные, вы же должны при подключении указать СВОИ данные для того, чтобы подключиться к СВОЕЙ базе данных. Пример подключения к БД:
// Задаём переменные для подключения к БД $db_host = 'mysql.moidomen.com'; $db_user = 'moi_login'; $db_password = 'moi_parol'; $database = 'moya_baza'; // Подключаемся к БД mysql_connect($db_host, $db_user, $db_password); mysql_select_db($database);
Далее нам нужно извлечь из БД из таблицы с зарегистрированными пользователями на сайте их логины. Если есть зарегистрированный пользователь с таким логином, сверяем пароли введённые при регистрации и авторизации. Если эти пароли совпадают, авторизовываем пользователья на сайте и выводим информацию на экран, что он вошёл. В противном случае пользователя не авторизовываем (он остаётся, как гость) и показываем информацию, что логин или пароль неверны. Не забываем прописывать функцию защиты пароля md5();, которая переводит пароль в хэш в виде 32-символьного шестнадцатеричного числа. Пример ниже:
$result = mysql_query("SELECT * FROM registr_users WHERE login='$login'"); //извлекаем из базы из таблицы зарегистрированных пользователей все данные о пользователе с введенным логином $myrow = mysql_fetch_array($result); if (empty($myrow['password'])) { //если пользователя с введенным логином не существует exit ("<br /><br />Извините, введённый вами login или пароль неверный!"); } else { //если существует, то сверяем пароли if ($myrow['password']== md5( "$password" )){ //если пароли совпадают, то запускаем данному пользователю сессию $_SESSION['login']=$myrow['login']; $_SESSION['id']=$myrow['id'];//эти данные очень часто используются, поэтому сессия запускается с использованием этих данных //Выводим информацию, что пользователь авторизован и снизу ссылку для перехода на главную страницу (можно на любую поставить ссылку) echo "<br /><br />Поздравляем! Вы успешно вошли на сайт! <br /><a href='/php-uroki/avtorizaciya/vhod.php'>Главная страница</a><br /><a href='/php-uroki/avtorizaciya/reg.php'>Регистрация</a>"; } else { //если пароли не совпали, выводим на экран информацию об этом и пользователя не авторизовываем exit ("<br /><br />Извините, введённый вами login или пароль неверный!"); } }
Полностью файл script1.php выглядит так:
<?php session_start();//вся процедура сверки логина и паролей работает на сессиях. Именно в них хранятся данные пользователя, пока он находится на сайте. Запускать сессию нужно в начале странички header('Refresh: 5; URL=http://lora.in.ua/php-uroki/avtorizaciya/vhod.php'); //redirect с задержкой echo 'Вы будете перенаправлены на главную страницу через 5 секунд.'; //вывод сообщения if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }//заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную if (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаём ошибку и останавливаем выполнение скрипта { exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); } $login = stripslashes($login);//удаляет экранирование символов, произведенное функцией addslashes() $login = htmlspecialchars($login);//преобразует специальные символы в HTML-сущности (обрабатываем их, чтобы теги и скрипты не работали на случай от действий умников-спамеров) $password = stripslashes($password); //удаляет экранирование символов, произведенное функцией addslashes() $password = htmlspecialchars($password); $login = trim($login);//удаляет пробелы (или другие символы) из начала и конца строки $password = trim($password); // Задаём переменные для подключения к БД $db_host = 'mysql.moidomen.com'; $db_user = 'moi_login'; $db_password = 'moi_parol'; $database = 'moya_baza'; // Подключаемся к БД mysql_connect($db_host, $db_user, $db_password); mysql_select_db($database); $result = mysql_query("SELECT * FROM registr_users WHERE login='$login'"); //извлекаем из базы из таблицы зарегистрированных пользователей все данные о пользователе с введенным логином $myrow = mysql_fetch_array($result); if (empty($myrow['password'])) { //если пользователя с введенным логином не существует exit ("<br /><br />Извините, введённый вами login или пароль неверный!"); } else { //если существует, то сверяем пароли if ($myrow['password']== md5( "$password" )){ //если пароли совпадают, то запускаем данному пользователю сессию $_SESSION['login']=$myrow['login']; $_SESSION['id']=$myrow['id'];//эти данные очень часто используются, поэтому сессия запускается с использованием этих данных //Выводим информацию, что пользователь авторизован и снизу ссылку для перехода на главную страницу (можно на любую поставить ссылку) echo "<br /><br />Поздравляем! Вы успешно вошли на сайт! <br /><a href='/php-uroki/avtorizaciya/vhod.php'>Главная страница</a><br /><a href='/php-uroki/avtorizaciya/reg.php'>Регистрация</a>"; } else { //если пароли не совпали, выводим на экран информацию об этом и пользователя не авторизовываем exit ("<br /><br />Извините, введённый вами login или пароль неверный!"); } } ?>
Форма регистрации
На странице с формой авторизации для незарегистрированных пользователей, но желающих это сделать есть ссылка на страницу с регистрацией, которую нам и нужно создать. Форма регистрации аналогична форме авторизации, разница только в количестве полей и обработчике, который будет эту форму обрабатывать. Поэтому в атрибуте тега form — action прописываем ссылку на обработчик script2.php. Форма регистрации registration.php выглядит следующим образом:
<?php echo " <html> <head> <link rel='stylesheet' type='text/css' href='style.css' /> <title>Форма входа на PHP</title> </head> <body> <!--Подключение обработчика формы--> <form id='forma' action='script2.php' method='POST'> <h1>Форма регистрации</h1> <p>Заполните поля для регистрации на сайте</p> <p>Имя<br /><input type='text' name='login' ></p> <p>Пароль<br /><input type='password' name='password' ></p> <p>Повторите пароль<br /><input type='password' name='password2'></p> <p>Email<br /><input type='text' name='email'></p> <p><input type='submit' value='OK' name='submit' ></p> </form> </body> </html>"; ?>
Обработчик формы регистрации
Как форма регистрации готова, приступим к созданию обработчика формы регистрации. Он будет очень похож на обработчик формы авторизации. В них используются практически одинаковые функции. Сначала мы передаём в переменные значение заполненных форм в полях регистрации. Проводим проверку, заполнено ли каждое поле и совпадают ли пароли в обоих полях — в поле «Пароль» и «Подтверждение пароля». Пароль переводим в ХЭШ, используя функцию MD5 (); Она переводит введённый пароль, то есть кодирует его в хэш в виде 32-символьного шестнадцатеричного числа. Как и в обработчике авторизации, в обработчике регистрации прописываем функции, которые в заполненных полях редактируют данные — удаляют экранирование символов, удаляют лишние пробелы, преобразуют символы в html-сущности. Например:
//Присваиваем каждому значению в форме переменную, передаём переменным данные форм if (isset($_POST['submit'])) { if(empty($_POST['login'])) { echo 'Вы не ввели логин'; } elseif(empty($_POST['password'])) { echo 'Вы не ввели пароль'; } elseif(empty($_POST['password2'])) { echo 'Вы не ввели подтверждение пароля'; } elseif($_POST['password'] != $_POST['password2']) { echo 'Введенные пароли не совпадают'; } elseif(empty($_POST['email'])) { echo 'Вы не ввели E-mail'; } else { $login=$_POST['login']; $password=$_POST['password']; $password2 = $_POST['password2']; $email = $_POST['email']; $password = md5( "$password" ); //выборка id из вашей таблицы зарегистрированных пользователей, сверка логина и пароля $query = "SELECT `id` FROM `registr_users` WHERE `login`='{$login}' AND `password`='{$password}'"; $login = stripslashes($login);//удаляет экранирование символов, произведенное функцией addslashes() $login = htmlspecialchars($login);//преобразует специальные символы в HTML-сущности (обрабатываем их, чтобы теги и скрипты не работали на случай от действий умников-спамеров) $password = stripslashes($password); $password = htmlspecialchars($password); $login = trim($login);//удаляет пробелы (или другие символы) из начала и конца строки $password = trim($password);
Затем подключаемся к базе данных. На примере обработчика авторизации мы уже знаем как это делать:
// Задаём переменные для подключения к БД $db_host = 'mysql.moidomen.com'; $db_user = 'moi_login'; $db_password = 'moi_parol'; $database = 'moya_baza'; // Подключаемся к БД mysql_connect($db_host, $db_user, $db_password); mysql_select_db($database);
Теперь нам осталось занести данные, введённые в поля формы регистрации в таблицу зарегистрированных пользователей registr_users, оповестить новоиспечённого пользователя о том, что регистрация прошла успешно выводом информации в браузер и предложить войти на сайт перейдя для этого по ссылке.
mysql_query("CREATE TABLE IF NOT EXISTS registr_users (`id` int(10) unsigned NOT NULL auto_increment, `date_created` datetime NOT NULL, `login` VARCHAR( 255 ) NOT NULL, `password` VARCHAR( 255 ) NOT NULL,`email` VARCHAR( 255 ) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6849") or die(mysql_error()); $sql = mysql_query($query) or die(mysql_error()); if (mysql_num_rows($sql) > 0) { echo 'Такой логин уже существует'; } else { //Записываем в БД данные форм $query="INSERT INTO `registr_users` (`id`, `date_created`, `login`, `password`, `email`) VALUES ('', NOW(), '$login', '$password', '$email')"; $result = mysql_query($query); if (!$result) { $feedback = 'ОШИБКА - Ошибка базы данных'; $feedback .= mysql_error(); return $feedback; } echo 'Регистрация успешно прошла'; echo '<br /><br /><a href="/vhod.php">Войти на сайт</a>'; }
В целом весь файл-обработчик формы регистрации script2.php выглядит так:
<?php //Присваиваем каждому значению в форме переменную, передаём переменным данные форм if (isset($_POST['submit'])) { if(empty($_POST['login'])) { echo 'Вы не ввели логин'; } elseif(empty($_POST['password'])) { echo 'Вы не ввели пароль'; } elseif(empty($_POST['password2'])) { echo 'Вы не ввели подтверждение пароля'; } elseif($_POST['password'] != $_POST['password2']) { echo 'Введенные пароли не совпадают'; } elseif(empty($_POST['email'])) { echo 'Вы не ввели E-mail'; } else { $login=$_POST['login']; $password=$_POST['password']; $password2 = $_POST['password2']; $email = $_POST['email']; $password = md5( "$password" ); //выборка id из вашей таблицы зарегистрированных пользователей, сверка логина и пароля $query = "SELECT `id` FROM `registr_users` WHERE `login`='{$login}' AND `password`='{$password}'"; $login = stripslashes($login);//удаляет экранирование символов, произведенное функцией addslashes() $login = htmlspecialchars($login);//преобразует специальные символы в HTML-сущности (обрабатываем их, чтобы теги и скрипты не работали на случай от действий умников-спамеров) $password = stripslashes($password); $password = htmlspecialchars($password); $login = trim($login);//удаляет пробелы (или другие символы) из начала и конца строки $password = trim($password); // Задаём переменные для подключения к БД $db_host = 'mysql.moidomen.com'; $db_user = 'moi_login'; $db_password = 'moi_parol'; $database = 'moya_baza'; // Подключаемся к БД mysql_connect($db_host, $db_user, $db_password); mysql_select_db($database); mysql_query("CREATE TABLE IF NOT EXISTS registr_users (`id` int(10) unsigned NOT NULL auto_increment, `date_created` datetime NOT NULL, `login` VARCHAR( 255 ) NOT NULL, `password` VARCHAR( 255 ) NOT NULL,`email` VARCHAR( 255 ) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6849") or die(mysql_error()); $sql = mysql_query($query) or die(mysql_error()); if (mysql_num_rows($sql) > 0) { echo 'Такой логин уже существует'; } else { //Записываем в БД данные форм $query="INSERT INTO `registr_users` (`id`, `date_created`, `login`, `password`, `email`) VALUES ('', NOW(), '$login', '$password', '$email')"; $result = mysql_query($query); if (!$result) { $feedback = 'ОШИБКА - Ошибка базы данных'; $feedback .= mysql_error(); return $feedback; } echo 'Регистрация успешно прошла'; echo '<br /><br /><a href="/vhod.php">Войти на сайт</a>'; } } } ?>
Пример формы авторизации
Ну вот, в принципе, и всё. Для наглядности примера авторизации можно посмотреть — поклацать здесь. Там всё тоже самое, только я ещё добавила файл css и подключила его.
Также вы можете скачать форму авторизации.