Создание формы регистрации в php. Создаем невероятную простую систему регистрации на PHP и MySQL
15.06.2019
Процесс создания системы регистрации – это довольно большой объем работы. Вам нужно написать код, который бы перепроверял валидность email-адресов, высылал email-письма с подтверждением, предлагал возможность восстановить пароль, хранил бы пароли в безопасном месте, проверял формы ввода и многое другое. Даже когда вы все это сделаете, пользователи будут регистрироваться неохотно, так как даже самая минимальная регистрация требует их активности.
В сегодняшнем руководстве мы займемся разработкой простой системы регистрации, с использованием которой вам не понадобятся никакие пароли! В результаты мы получим, систему, которую можно будет без труда изменить или встроить в существующий PHP-сайт. Если вам интересно, продолжайте чтение.
PHP
Теперь мы готовы к тому, чтобы заняться кодом PHP. Основной функционал системы регистрации предоставляется классом User, который вы можете видеть ниже. Класс использует (), представляющую собой минималистскую библиотеку для работы с базами данных. Класс User отвечает за доступ к базам данных, генерирование token-ов для логина и их валидации. Он представляет нам простой интерфейс, который можно без труда включить в систему регистрации на ваших сайтах, основанных на PHP.
User.class.php
// Private ORM instance private $orm;
/** * Find a user by a token string. Only valid tokens are taken into * consideration. A token is valid for 10 minutes after it has been generated. * @param string $token The token to search for * @return User */
Public static function findByToken($token){
// find it in the database and make sure the timestamp is correct
// Mark the user as logged in $_SESSION["loginid"] = $this->orm->id;
// Update the last_login db field $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); }
/** * Destroy the session and logout the user. * @return void */
Public function logout(){ $_SESSION = array(); unset($_SESSION); }
/** * Check whether the user is logged in. * @return boolean */
Public function loggedIn(){ return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; }
/** * Check whether the user is an administrator * @return boolean */
Public function isAdmin(){ return $this->rank() == "administrator"; }
/** * Find the type of user. It can be either admin or regular. * @return string */
Public function rank(){ if($this->orm->rank == 1){ return "administrator"; }
Return "regular"; }
/** * Magic method for accessing the elements of the private * $orm instance as properties of the user object * @param string $key The accessed property"s name * @return mixed */
Public function __get($key){ if(isset($this->orm->$key)){ return $this->orm->$key; }
Return null; } }
Token-ы генерируются при помощи алгоритма , и сохраняются в базу данных. Мы используем из MySQL для установки значения в колонку token_validity, равного 10 минутам. При валидации token, мы сообщаем движку, что нам нужен token, поле token_validity пока еще не истекло. Таким образом мы ограничиваем время, в течение которого token будет валиден.
Обратите внимание на то, что мы используем волшебный метод __get () в конце документа, чтобы получить доступ к свойствам объекта user. Это позволяет нам осуществить доступ к данным, которые хранятся в базе данных в виде свойств: $user->email, $user->token. Для примера давайте посмотрим, как мы можем использовать этот класс в следующем фрагменте кода:
Еще один файл, в котором хранится необходимый функционал, это functions.php. Там у нас есть несколько вспомогательных функций, которые позволяют нам сохранить остальной код более опрятным.
Functions.php
Function send_email($from, $to, $subject, $message){
function redirect($url){ header("Location: $url"); exit; }
Функции rate_limit и rate_limit_tick позволяют нам ограничивать число попыток авторизации на определенный промежуток времени. Попытки авторизации записываются в базу данных reg_login_attempt. Эти функции запускаются при проведении подтверждения формы авторизации, как можно видеть в следующем фрагменте кода.
Нижеприведенный код был взят из index.php, и он отвечает за подтверждение формы авторизации. Он возвращает JSON-ответ, который управляется кодом jQuery, который мы видели в assets/js/script.js.
If(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)){ throw new Exception("Please enter a valid email."); }
// This will throw an exception if the person is above // the allowed login attempt limits (see functions.php for more): rate_limit($_SERVER["REMOTE_ADDR"]);
// Record this login attempt rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["email"]);
If(!$result){ throw new Exception("There was an error sending your email. Please try again."); }
Die(json_encode(array( "message" => "Thank you! We\"ve sent a link to your inbox. Check your spam folder as well." ))); } } catch(Exception $e){
Die(json_encode(array( "error"=>1, "message" => $e->getMessage() ))); }
При успешной авторизации или регистрации, вышеприведенный код отсылает email человеку с ссылкой для авторизации. Token (лексема) становится доступной в качестве $_GET-переменной "tkn" ввиду сгенерированного URL.
index.php
If(isset($_GET["tkn"])){
// Is this a valid login token? $user = User::findByToken($_GET["tkn"]);
// Yes! Login the user and redirect to the protected page.
$user->login(); redirect("protected.php"); }
// Invalid token. Redirect back to the login form. redirect("index.php"); }
Запуск $user->login() создаст необходимые переменные для сессии, что позволит пользователю оставаться авторизованным при последующих входах.
Выход из системы реализуется примерно таким же образом:
Index.php
If(isset($_GET["logout"])){
$user = new User();
If($user->loggedIn()){ $user->logout(); }
Redirect("index.php"); }
В конце кода мы снова перенаправляем пользователя на index.php, поэтому параметр?logout=1 в URL исключается.
Нашему файлу index.php также потребуется защита – мы не хотим, чтобы уже авторизованные пользователи видели форму. Для этого мы используем метод $user->loggedIn():
Index.php
$user = new User();
if($user->loggedIn()){ redirect("protected.php"); }
Наконец, давайте посмотрим, как можно защитить страницу вашего сайта, и сделать ее доступной только после авторизации:
protected.php
// To protect any php page on your site, include main.php // and create a new User object. It"s that simple!
require_once "includes/main.php";
$user = new User();
if(!$user->loggedIn()){ redirect("index.php"); }
После этой проверки вы можете быть уверены в том, что пользователь успешно авторизовался. У вас также будет доступ к данным, которые хранятся в базе данных в качестве свойств объекта $user. Чтобы вывести email пользователя и их ранг, воспользуйтесь следующим кодом:
Echo "Your email: ".$user->email; echo "Your rank: ".$user->rank();
Здесь rank() – это метод, так как колонка rank в базе данных обычно содержит числа (0 для обычных пользователей и 1 для администраторов), и нам нужно преобразовать это все в названия рангов, что реализуется при помощи данного метода. Чтобы преобразовать обычного пользователя в администратора, просто отредактируйте запись о пользователе в phpmyadmin (либо в любой другой программе по работе с базами данных). Будучи администратором, пользователь не будет наделен какими-то особыми возможностями. Вы сами в праве выбирать, каким правами наделять администраторов.
Готово!
На этом наша простенькая система регистрации готова! Вы можете использовать ее на уже существующем PHP-сайте, либо модернизировать ее, придерживаясь собственных требований.
HTML формы — сложные элементы интерфейса. Они включают в себя разные функциональные элементы: поля ввода и
Большая часть информации веб-форм передаётся с помощью элемента . Для ввода одной строки текста применяется элемент , для нескольких строк - элемент
Элемент
Last NameLast NameLast Name
Поля формы можно разделять на логические блоки с помощью элемента