Когда мы практиковались в авторизации через БД, мы вносили данные на пользователей через PHPMyAdmin. Однако, конечно же, в реальных условиях такого не происходит.

Пользователи сами выбирают свой логин и пароль. Это называется регистрацией.

При регистрации обычно не ограничиваются логином и паролем, обычно спрашивают email, возраст, город и еще кучу другой нужной и не очень информации.

Не увлекайтесь этим! Пользователи не любят заполнять лишние поля.

Делаем простую регистрацию

Самая простая регистрация такая: пользователь вводит желаемый логин и пароль и эти данные заносятся в базу данных.

Давайте изучим ее на следующем примере:


	<form action='index.php' method='POST'>
		<input name='login'> логин
		<input name='password'> пароль
		<input type='submit' value='Отправить'>
	</form>
<?php
	//Если форма регистрации отправлена и ВСЕ поля непустые...
	if ( !empty($_REQUEST['password']) and !empty($_REQUEST['login']) ) {
		//Пишем логин и пароль из формы в переменные (для удобства работы):
		$login = $_REQUEST['login']; 
		$password = $_REQUEST['password']; 

		/*
			Формируем и отсылаем SQL запрос:
			ВСТАВИТЬ В таблицу_users УСТАНОВИТЬ логин = $login И пароль = $password
		*/
		$query = 'INSERT INTO users SET login="'.$login.'", password="'.$password.'"';
		mysql_query($query); 

		//Выведем сообщение об успешной регистрации:
		echo 'Вы успешно зарегистрированы!';
	}
	//Не заполнено какого-либо из полей...
	else {
		echo 'Поля не могут быть пустыми!';
	}
?>

Закрываем пароль от посторонних глаз

Обратите внимание на то, что в предыдущем примере пароль вводится в открытом виде, то есть без звездочек. Как мы уже знаем, это плохая практика.

Но мы не можем добавить паролю звездочки просто так - если пользователь допустит ошибку при вводе пароля, то он ее не заметит, в базу данных сохранится не тот пароль, который хотел пользователь, и потом он просто не сможет авторизоваться.

Чтобы решить эту проблему обычно поступают так: вводят два поля для ввода пароля, одно из них пароль, а второе - его подтверждение.

Оба поля должны выдавать звездочки (то есть иметь тип password), чтобы никто не мог подсмотреть пароль через плечо.

Наш PHP скрипт должен сравнить пароль и его подтверждение, и случае их несовпадения выдать ошибку - в этом и заключается смысл ввода второго поля.

Итак, сделаем это:

<!-- Это форма регистрации: -->
	<form action='index.php' method='POST'>
		<input name='login'> логин
		<input name='password' type='password'> пароль
		<input name='password_confirm' type='password'> подтвердите пароль
		<input type='submit' value='Отправить'>
	</form>
<!-- Конец формы регистрации. -->
<?php
	if (
		!empty($_REQUEST['password']) 
		and !empty($_REQUEST['password_confirm'])
		and !empty($_REQUEST['login'])
	) {

		//Пишем логин и пароль из формы в переменные (для удобства работы):
		$login = $_REQUEST['login']; 
		$password = $_REQUEST['password']; 
		$password_confirm = $_REQUEST['password_confirm']; //подтверждение пароля

		//Если пароль и его подтверждение совпадают...
		if ($password == $password_confirm) {
			/*
				Формируем и отсылаем SQL запрос:
				ВСТАВИТЬ В таблицу_users УСТАНОВИТЬ логин = $login И пароль = $password
			*/
			$query = 'INSERT INTO users SET login="'.$login.'", password="'.$password.'"';
			mysqli_query($link, $query); 

			//Выведем сообщение об успешной регистрации:
			echo 'Вы успешно зарегистрированы!';
		}
		//Если пароль и его подтверждение НЕ совпадают - выведем ошибку:
		else {
			echo 'Пароли не совпадают!';
		}
	}
	//Не заполнено какого-либо из полей...
	else {
		echo 'Поля не могут быть пустыми!';
	}
?>

Некоторые замечания:

  1. Обратите внимание на то, что логин не принято прятать за звездочками. Обычно логин считается общедоступной информацией, а пароль - закрытой.
  2. На некоторых сайтах, кроме двойного ввода пароля практикуется еще и двойной ввод email, причем он записан в открытом виде. Не делайте так! Пользователя ужасно раздражают поля, которые он должен заполнять. И если их слишком много и в них нет смысла (как с двойным вводом email) - пользователь может уйти с сайта не закончив регистрацию!
  3. Вам необходимо сделать так, чтобы при отправлении формы поля, заполненные пользователем, не очищались. Не должно быть так - пользователь потратил энное время на заполнение формы, но допустил ошибку в одном месте, и ему выдается сообщении об ошибке, при этом все значения формы становятся пустыми! У нас пока сделано именно так. Реализуйте заполнение полей самостоятельно.

Проверяем, что логин не занят

Пользователь не должен иметь возможность зарегистрировать занятый логин.

Поэтому перед сохранением нового пользователя в базу данных мы должны выполнить еще один SQL запрос, который проверит, свободен ли новый логин.

Сделаем это:

<!-- Это форма регистрации: -->
	<form action='index.php' method='POST'>
		<input name='login'> логин
		<input name='password' type='password'> пароль
		<input name='password_confirm' type='password'> подтвердите пароль
		<input type='submit' value='Отправить'>
	</form>
<!-- Конец формы регистрации. -->
<?php
	//Если форма регистрации отправлена и ВСЕ поля непустые...
	if (
		!empty($_REQUEST['password'])
		and !empty($_REQUEST['password_confirm'])
		and !empty($_REQUEST['login'])
	) {

		//Пишем логин и пароль из формы в переменные (для удобства работы):
		$login = $_REQUEST['login']; 
		$password = $_REQUEST['password']; 
		$password_confirm = $_REQUEST['password_confirm']; //подтверждение пароля

		//Если пароль и его подтверждение совпадают...
		if ($password == $password_confirm) {
			/*
				Выполняем проверку на незанятость логина.
				Ответ базы запишем в переменную $is_login_free. 

				ВЫБРАТЬ ИЗ таблицы_users ГДЕ логин = $login.
			*/
			$query = 'SELECT*FROM users WHERE login="'.$login.'"';
			$is_login_free = mysqli_query($link, $query);

			//Если $is_login_free пустой - то логин не занят!
			if (empty( $is_login_free)) {
				/*
					Формируем и отсылаем SQL запрос:

					ВСТАВИТЬ В таблицу_users УСТАНОВИТЬ 
					логин = $login И пароль = $password.
				*/
				$query = 'INSERT INTO users SET login='.$login.', password='.$password;
				mysqli_query($link, $query); 

				//Выведем сообщение об успешной регистрации:
				echo 'Вы успешно зарегистрированы!';
			}
			//Если $is_login_free НЕ пустой - то логин занят!
			else {
				echo 'Такой логин уже занят!';
			}
		}
		//Если пароль и его подтверждение НЕ совпадают - выведем ошибку:
		else {
			echo 'Пароли не совпадают!';
		}
	}
	//Не заполнено какого-либо из полей.
	else {
		echo 'Поля не могут быть пустыми!';
	}
?>