Кек
лолХуй пизда пересда
База данных
Для начала нам необходимо создать таблицу users, где буду храниться данные о пользователях вашего веб-приложения. У пользователя будут имя, электронный адрес и пароль.
Форма регистрации
Всё, что видит пользователь в момент регистрации, - это форма с полями для ввода, где предлагается ввести валидные и, чаще всего, уникальные данные для логина и электронного адреса. Также мы можем сделать эти поля обязательными, чтобы пользователь не смог отправить пустую форму. Сделать это можно через опцию required в теге input.
Данные для регистрации лучше передавать методом post, чтобы они не отображались в адресной строке браузера.
Подключение к базе данных
Мы будем использовать популярное расширение PDO для подключения к базе данных. Коротко говоря, PDO - это класс, предоставляющий методы для работы с объектами и подготовленными выражениями, которые заметно повышают эффективность и безопасность работы с данными.
Для уверенного подключения мы оборачиваем код в блок try.. catch, чтобы отобразить ошибку в случае неправильных настроек подключения к базе данных и её исправить. Объект PDO принимает данные о хосте, названии базы данных, логине и пароле от базы, если он есть.
Скрипт регистрации
В коде у нас будет цепь условий, которые поэтапно проверяют введённые пользователям данные, очищают их, экранируют код с помощью функции htmlspecialchars, если пользователь задумает внедрить скрипт, а также отрезают пробелы с двух сторон при помощи trim.
В if условии мы проверяем на существование кнопку, которая подсказывает нам, что пользователь заполнил форму и отправил данные. Если данные есть, мы их обрабатываем с помощью функций, описанных выше. Важно понимать, что все данные, отправленные методом POST хранятся в глобальном массиве $_POST, откуда мы их и достаём.
В следующих трёх условиях мы проверяем наши данные на пустоту, соответствия имени регулярному выражению и валидности электронного адреса. Для этого в PHP есть специальная функция filter_var, принимающая в качестве параметра данные и опцию FILTER_VALIDATE_EMAIL. Если эти условия не выполняются, то мы отправляем информацию через header в GET-параметре (который впоследствии обработаем и выведем пользователю сообщение об успехе или ошибке регистрации), а также завершаем скрипт функцией exit().
Дальше мы должны проверить, равны ли пароли, введённые пользователем. Если нет, отправляем пользователя обратно на страницу с регистрацией через header и показываем соответствующую ошибку. Если же они равны, мы проверяем на существование пользователя с таким же электронным адресом в базе.
Тут мы обращаемся к объекту PDO, который создали ранее, и через подготовленное выражение выводим число электронных адресов, совпадающих с тем, что ввёл пользователь. Если результат окажется больше нуля, пользователь уже существует и регистрировать его повторно мы не будем. Соответственно, отсылаем пользователя обратно на страницу регистрации с ошибкой. В конце мы должны проверить, не меньше ли пароль шести символов, и, в зависимости от результата, продолжаем код дальше или отсылаем пользователя обратно.
Завершение регистрации
Наконец, если пользователь ввёл правильные данные, мы регистриуем его. Для этого сначала мы хешируем пароль с помощью функции php password_hash, которая принимает сам пароль и алгоритм шифрования. Далее мы обращаемся к объекту базы данных, подготавливаем данные с помощью prepare и связываем их с реальными данными с помощью метода PDO bindParam. После этого мы можем заканчивать регистрацию и отправлять пользователя на страницу авторизации.
Вывод ошибок
Одним из способов вывода ошибок, допущенных пользователем при регистрации, является передача их через адресную строку в GET-параметре. В скрипте регистрации мы передавали различные типы ошибок, чтобы обработать их отдельно и вывести. Используя конструкцию switch... case, мы узнаём о типе ошибки и выводим предупреждающее сообщение.
Скрипт авторизации
Закончив регистрацию, пользователя можно авторизировать. Первым делом мы открываем сессию с помощью функции session_start() и заносим туда данные пользователя, существование которых будем проверять на каждой странице. Это нужно для того, чтобы отличать одного пользователя от другого и показывать соответствующую информацию каждому из них.
Также мы снова проверяем на существование кнопку и очищяем данные пользователя от зловредного кода (это опционально, поскольку если форма регистрации работает надёжно, злоумышленник не сможет внедрить скрипт на сайт через авторизацию, поскольку данные в базу не заносятся, а лишь сравниваются с существующими).
Далее мы проверяем данные на пустоту. Если их нет, показываем ошибку.
Иначе достаём данные по электронному адресу. Если таких адресов меньше одного, то такого пользователя не существует, в обратном случае начинаем авторизацию.
Мы должны проверить, соответствует ли пароль, введённый пользователь, тому, что хранится в базе данных. Сделать это можно с помощью php функции password_verify, которая принимает два параметра - пароль, введённый пользователем при авторизации, и пароль из базы данных. Если результат равен false, возвращаем ошибку, иначе заносим в сессию данные пользователя из базы. Теперь везде, где данные пользователя могут потребоваться для вывода нужной ему информации, мы должны начинать сессию.
На этом авторизацию можно заканчивать. Стоит предупредить, что код написан в процедурном стиле, что редко бывает на продакшене, однако это сделано с целью объяснить начинающих программистам принципы работы с формами.