Здравствуйте! Облазил множество ресурсов, но так и не нашел ни одной полезной, правильной, легкой и работающей статьи на тему “Как сделать Вход и Регистрацию на сайте”.

Что будет использоваться? Использоваться будет только 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: /');

 ?>