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

Письмо о регистрации

Иногда при регистрации пользователю отправляется письмо о том, что он зарегистрировался на вашем сайте.

В это письмо иногда ложат логин и пароль, могут также написать информацию, введенную пользователем при регистрации (для проверки).

Верификация пользователя

Иногда в письме с сообщением о регистрации лежит так называемый ссылка верификации.

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

Чтобы реализовать такое, нужно в таблицу users добавить еще два поля: поле с отметкой о том, что пользователь прошел верификацию, и поле, в котором хранится код верификации:

id login verification
отметка о верификации
verification_code
код о верификации
1 user 0 jblhgyHkohgfj
2 admin 1 hkpkhF75gcnh

Ссылка на верификацию в письме должна выглядеть примерно так: verify.php?verification_code=jblhgyHkohgfj

Если кто-то переходит по этой ссылке - мы ищем пользователя в базе данных с таким кодом и в поле verification пишем '1'.

В принципе, код верификации может совпадать у разных пользователей, особенно если их очень много. Поэтому лучше ссылку верификации построить так: verify.php?login=user&verification_code=jblhgyHkohgfj. Тогда мы будем искать пользователя с конкретным логином и у него проверять совпадение кода верификации.

До того, как пользователь прошел верификацию, его нельзя авторизовывать. Поэтому будем выполнять эту проверку (что в поле verification стоит единица) в SQL запросе на авторизацию:

<?php
	$query = 'SELECT*FROM users WHERE login="'.$login.'" AND verification=1';
?>

Верификацию на сайте стоит вводить только если она действительно нужна. Как и все действия, бессмысленные с точки зрения пользователя, она может его раздражать, и вы будете терять часть потенциальных посетителей!

Личный кабинет пользователя

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

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

Просмотр профиля

Обычно просмотр чужого профиля доступен всем пользователям на сайте.

Просматривая свой профиль можно увидеть какие-либо дополнительные функции - редактирование и т.д.

Как это реализовать?

Пусть страница профиля называется profile.php.

Будем вызывать ее с GET параметром, задающим id пользователя: http://site/profile.php?id=2.

Затем нужно сравнить id из GET и id из сессии, если они совпадают - тогда пользователь смотрит свой профиль, если не совпадают - чужой.

Изменение пароля

Пользователю стоит предоставить возможность изменить свой пароль.

Обычно это делается в личном кабинете.

Однако эта операция должна требовать ввода старого пароля.

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

Если же эта операция требует ввода старого пароля - никто не сможет украсть ваш аккаунт, просто сев за ваш компьютер.

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

Поэтому у вас должно быть три поля с паролями типа password: старый пароль ($old_password), новый пароль ($password) и проверка нового пароля ($password_confirm).

Алгоритм такой:

  1. Если новый пароль и его подтверждение не совпадают - выведем ошибку.
  2. Если совпадают - тогда берем id пользователя из сессии и делаем SQL запрос, чтобы узнать соленый пароль пользователя и соль (и все остальное, если нужно).
  3. Солим старый пароль из формы и сравниваем его с паролем из базы данных.
  4. Если совпадают - то меняем пароль на новый.

Редактирование профиля

Пользователь должен иметь возможность редактировать те данные, которые он ввел при регистрации.

Алгоритм такой:

  1. Берем id пользователя из сессии и делаем SQL запрос, чтобы узнать его данные.
  2. Выводим форму редактирования, которая должна быть заполнена данными из БД (если отправки формы еще не было, нужно проверить то, что массив POST пустой).
  3. Пользователь редактирует то, что ему нужно и жмет кнопку 'Применить'.
  4. Делаем валидацию полей. Если все нормально - обновляем значения в базе для пользователя с этим id.
  5. Если при заполнении допущена ошибка - выведем сообщения об ошибке и поля заполним данными из $_REQUEST, а не из базы (да и запрос к БД делается только тогда, когда не была отправлена форма!).

Удаление аккаунта

Пользователь должен иметь возможность удалить свой аккаунт.

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

  1. Берем id пользователя из сессии и делаем SQL запрос, чтобы узнать соленый пароль пользователя и соль (и все остальное, если нужно).
  2. Солим пароль из формы подтверждения и сравниваем его с паролем из базы данных.
  3. Если совпадают - то удаляем пользователя SQL-запросом DELETE:
<?php
	$query = 'DELETE FROM users WHERE id="'.$_SESSION['id'].'"';
?>

Обмен личными сообщениями

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

Сделать это не очень сложно.

Пусть пользователь смотрит чужой профиль и хочет отправить его хозяину личное сообщение.

Для этого при просмотре чужого профиля следует сделать ссылку 'Оправить личное сообщение'.

Ссылка должна вести на страницу оправки и передавать id чужого профиля (то есть адресата) через GET-параметр.

Пусть страница отправки называется messages.php, и мы смотрим пользователя с id=2. Тогда ссылка на оправку сообщения этому пользователю должна выглядеть так: messages.php?id=2.

На странице messages.php должна быть форма отправки сообщения.

Автор (его id пусть будет '1') пишет свое сообщение и нажимает кнопку 'Отправить'.

Сообщение должно занестись в таблицу сообщений такого вида:

id recipient _id
id получателя
sender_id
id отправителя
message
сообщение
1 2 1 Привет, как дела?
2 1 2 Отлично, а у тебя?

Id получателя мы берем из GET-параметра, а id отправителя - из сессии.

Ну, а получение сообщения элементарно, если вы умеете работать с БД.

Реализуйте его сами!