Вход/Регистрация на PHP + MySQL за 20 минут
Здравствуйте! Облазил множество ресурсов, но так и не нашел ни одной полезной, правильной, легкой и работающей статьи на тему “Как сделать Вход и Регистрацию на сайте”.
Что будет использоваться? Использоваться будет только HTML + Bootstrap, а также PHP + MySQL.
Какие возможности будут у данной формы? Пользователь сможет зарегистрироваться, войти, а также выйти из своего аккаунта, пароль будет шифроваться, будут обрабатываться некоторые ошибки, остальное пишите сами. Приступим!
Создание Базы Данных
Я буду работать на локальном хостинге, а именно на OpenServer. Для того чтобы создать базу данных, необходимо войти в phpmyadmin, затем нажать на кнопку «Создать Базу Данных».
Далее вводите название своей базы данных, у меня это будет — «register-bd».
Дальше создаем таблицу, называем таблицу users, в ней будет 4 столбца.
Заполнение таблицы
Дальше нам нужно ввести переменные в базу данных. Первая переменная — id. Это будет уникальный айди пользователя. В поле имя вводим «id»; тип — INT, так как это буду просто целые числа; Длина/Значения — 11, таким образом это будет 11-ти значное число, думаю нам его должно хватить; Атрибуты — «UNSIGNED» — числа только положительные; Индекс — «UNIQUE», во всплывающем окне пишем — «id», то есть каждый следующий айди будет больше на 1, чем предыдущий; A_I — ставим галочку.
Следующая строка — login, VARCHAR, 50, сравнение — utf_8_general_ci. Следующие поля это login и pass, применяем все тоже самое. Далее Тип таблиц выбираем: MyISAM и нажимаем сохранить. В итоге у Вас все должно выглядеть вот так:
Разработка дизайна формы
Теперь быстро верстаем форму для авторизации и регистрации на Bootstrap, называем файл index.php, думаю в этом ничего сложного нету, поэтому просто оставляю код здесь:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<title>Вход/Регистрация</title>
</head>
<body>
<div class="container mt-4">
<div class="row">
<div class="col">
<h1>Форма регистрации</h1>
<form action="check.php" method="post">
<input type="text" name="login" class="form-control" id="login" placeholder="Логин"><br>
<input type="text" name="name" class="form-control" id="name" placeholder="Имя"><br>
<input type="password" name="pass" class="form-control" id="pass" placeholder="Пароль"><br>
<button class="btn btn-success">Зарегистрироваться</button><br>
</form>
</div>
<div class="col">
<h1>Форма регистрации</h1>
<form action="auth.php" method="post">
<input type="text" name="login" class="form-control" id="login" placeholder="Логин"><br>
<input type="password" name="pass" class="form-control" id="pass" placeholder="Пароль"><br>
<button class="btn btn-success">Авторизоваться</button><br>
</form>
</div>
</div>
</div>
</body>
</html>
Регистрация
check.php
Создаем файл check.php.
Для начала Мы получаем все значения из полей регистрации и убираем все ненужные теги и пробелы, а то мало ли, что там пользователь может написать.
<?php
$login = filter_var(trim($_POST['login']), FILTER_SANITIZE_STRING); // Удаляет все лишнее и записываем значение в переменную //$login
$name = filter_var(trim($_POST['name']), FILTER_SANITIZE_STRING);
$pass = filter_var(trim($_POST['pass']), FILTER_SANITIZE_STRING); ?>
Дальше мы проверяем логин и имя на длину. Если длина меньше 5, мы выводим сообщение об ошибке.
if(mb_strlen($login) < 5 || mb_strlen($login) > 90){
echo "Недопустимая длина логина";
exit();
}
else if(mb_strlen($name) < 5){
echo "Недопустимая длина имени.";
exit();
} // Проверяем длину имени
?>
Теперь мы хешируем пароль, с помощью md5(), и добавляем свои какие-то рандомные символы, для усложнения пароля, у меня это будет: «thisiforhabr»
$pass = md5($pass."thisisforhabr"); // Создаем хэш из пароля
Далее мы подключаемся к Базе Данных, первый параметр это хост, второй — имя пользователя, третье — пароль и четвертое это название БД:
$mysql = new mysqli('localhost', 'root', '', 'register-bd');
Затем мы проверяем логин на совпадение, если в Базе Данных система находит такой же логин — сообщаем об ошибке.
$result1 = $mysql->query("SELECT * FROM `users` WHERE `login` = '$login'");
$user1 = $result1->fetch_assoc(); // Конвертируем в массив
if(!empty($user1)){
echo "Данный логин уже используется!";
exit();
}
Что в этом коде происходит ?
В первой строке идет язык SQL, мы говорим базе данных отбирать из таблицы users, login, который совпадает с логином, который ввел пользователь, дальше создаем массив и если массив не пустой, значит система что-то нашла, из этого выходит что такой логин уже зарегистрирован — уведомляем пользователя об этом.
Если все в порядке — регистрируем в Базе Данных пользователя и закрываем соединение:
$mysql->query("INSERT INTO `users` (`login`, `pass`, `name`)
VALUES('$login', '$pass', '$name')");
$mysql->close();
Авторизация
auth.php
Теперь приступим к авторизации, все так же получаем данные из полей, только имя нам теперь не нужно:
$login = filter_var(trim($_POST['login']), FILTER_SANITIZE_STRING);
$pass = filter_var(trim($_POST['pass']), FILTER_SANITIZE_STRING);
Шифруем пароль, подключаемся к базе данных, создаем массив и проверяем в БД на совпадение пароля и логина — если совпадения находит, то одобряем пользователю вход, если нет — выводим сообщение об ошибке:
if(count($user) == 0){
echo "Такой пользователь не найден.";
exit();
}
else if(count($user) == 1){
echo "Логин или праоль введены неверно";
exit();
}
setcookie('user', $user['name'], time() + 3600, "/");
$mysql->close();
header('Location: page.html');
header… Означает что пользователя, если авторизация прошла успешно, будет перебрасывать на страницу page.html. Поэтому создаем страницу page.html и пишем просто ссылку:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>Привет!</h1>
<a href="exit.php">Что бы выйти нажмите по ссылке.</a>
</body>
</html>
Выход
Для того чтобы пользователь вышел — нам всего лишь нужно очистить куки, создаем файл exit.php и в нем пишем:
<?php
setcookie('user', $user['name'], time() - 3600, "/");
header('Location: /');
?>
На этом у меня все, если у кого-то будет что-то не получаться или не работать — пишите в комментарии! Я постараюсь всем ответить и по возможности помочь.
Итоговый код всех файлов
index.php
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<title>Вход/Регистрация</title>
</head>
<body>
<div class="container mt-4">
<div class="row">
<div class="col">
<h1>Форма регистрации</h1>
<form action="check.php" method="post">
<input type="text" name="login" class="form-control" id="login" placeholder="Логин"><br>
<input type="text" name="name" class="form-control" id="name" placeholder="Имя"><br>
<input type="password" name="pass" class="form-control" id="pass" placeholder="Пароль"><br>
<button class="btn btn-success">Зарегистрироваться</button><br>
</form>
</div>
<div class="col">
<h1>Форма регистрации</h1>
<form action="auth.php" method="post">
<input type="text" name="login" class="form-control" id="login" placeholder="Логин"><br>
<input type="password" name="pass" class="form-control" id="pass" placeholder="Пароль"><br>
<button class="btn btn-success">Авторизоваться</button><br>
</form>
</div>
</div>
</div>
</body>
</html>
check.php
<?php
$login = filter_var(trim($_POST['login']), FILTER_SANITIZE_STRING); // Удаляет все лишнее и записываем значение в переменную //$login
$name = filter_var(trim($_POST['name']), FILTER_SANITIZE_STRING);
$pass = filter_var(trim($_POST['pass']), FILTER_SANITIZE_STRING);
if(mb_strlen($login) < 5 || mb_strlen($login) > 90){
echo "Недопустимая длина логина";
exit();
}
else if(mb_strlen($name) < 5){
echo "Недопустимая длина имени.";
exit();
} // Проверяем длину имени
$pass = md5($pass."thisisforhabr"); // Создаем хэш из пароля
$mysql = new mysqli('localhost', 'root', '', 'register-bd');
$result1 = $mysql->query("SELECT * FROM `users` WHERE `login` = '$login'");
$user1 = $result1->fetch_assoc(); // Конвертируем в массив
if(!empty($user1)){
echo "Данный логин уже используется!";
exit();
}
header('Location: /');
exit();
?>
auth.php
<?php
$login = filter_var(trim($_POST['login']), FILTER_SANITIZE_STRING);
$pass = filter_var(trim($_POST['pass']), FILTER_SANITIZE_STRING);
$pass = md5($pass."forhktkntuhpi"); // Создаем хэш из пароля
$mysql = new mysqli('localhost', 'root', '', 'register-bd');
$result = $mysql->query("SELECT * FROM `users` WHERE `login` = '$login' AND `pass` = '$pass'");
$user = $result->fetch_assoc(); // Конвертируем в массив
if(count($user) == 0){
echo "Такой пользователь не найден.";
exit();
}
else if(count($user) == 1){
echo "Логин или праоль введены неверно";
exit();
}
setcookie('user', $user['name'], time() + 3600, "/");
$mysql->close();
header('Location: page.html');
?>
page.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>Привет!</h1>
<a href="exit.php">Что бы выйти нажмите по ссылке.</a>
</body>
</html>
exit.php
<?php
setcookie('user', $user['name'], time() - 3600, "/");
header('Location: /');
?>