Написати реєстрацію на php. Створення простої системи реєстрації користувачів на PHP і MySQL
Для того, щоб розділити відвідувачів сайту на деякі групи на сайті обов'язково встановлюють невелику систему реєстрації на php. Таким чином ви умовно поділяєте відвідувачів на дві групи просто випадкових відвідувачів і на більш привілейовану групу користувачів, яким ви видаєте більш цінну інформацію.
У більшості випадків, застосовують більш спрощену систему реєстрації, яка написана на php в одному файлі register.php.
Отже, ми трохи відволіклися, а зараз розглянемо більш докладно файл реєстрації.
файл register.php
Для того, щоб у вас це не відняло безліч часу створимо систему, яка буде збирати користувачів, приймаючи від них мінімальну контактну інформацію. В даному випадку все будемо заносити в базу даних mysql. Для максимальної швидкості роботи бази, будемо створювати таблицю users в форматі MyISAM і в кодуванні utf-8.
Зверніть увагу! Писати все скрипти потрібно завжди в одному кодуванні. Всі файли сайту і база даних MySql повинні бути в єдиній кодуванні. Найпоширеніші кодування UTF-8 і Windows-1251.
Для чого потрібно писати все в одному кодуванні ми поговоримо як-небудь пізніше. А поки прийміть цю інформацію як найсуворіше правило створення скриптів інакше в майбутньому виникнуть проблеми з роботою скриптів. Нічого страшного, звичайно, але просто втратите багато часу для пошуку помилок в роботі скрипта.
Як буде працювати сам скрипт?
Ми хочемо все спростити і отримати швидкий результат. Тому будемо отримувати від користувачів тільки логін, email і його пароль. А для захисту від спам-роботів, встановимо невелику капчу. Інакше який-небудь хлопчик з Лондона напише невеликий робот-парсер, який заповнить всю базу липовими користувачами за кілька хвилин, і буде радіти своїй геніальності і безкарності.
Ось сам скрипт. Все записано в одному файлі register.php:
!
`; // червоний знак питання $ sha \u003d $ sh. "Scripts / pro /"; // шлях до основної папці $ bg \u003d `bgcolor \u003d" # E1FFEB "`; // фоновий колір рядків?\u003e Приклад скрипта реєстрації register.php style.css "/\u003e
В даному випадку скрипт звертається до самого себе. І є формою і обробником даних занесених в форму. Звертаю вашу увагу, що файл стиснутий zip-архівом і містить файл конфігурації config.php, дамп бази даних users, файл містить допоміжні функції functions.php, файл стилів style.css і сам файл register.php. Також кілька файлів, які відповідають за роботу і генерацію символів капчи.
Reg.ru: домени і хостинг
Найбільший реєстратор і хостинг-провайдер в Росії.
Більше 2 мільйонів доменних імен на обслуговуванні.
Просування, пошта для домену, рішення для бізнесу.
Понад 700 тис. Клієнтів по всьому світу вже зробили свій вибір.
* Наведіть курсор миші для припинення прокрутки.
Назад вперед
Створення простої системи реєстрації користувачів на PHP і MySQL
Створення системи реєстрації - це велика робота. Вам доводиться писати код, який здійснює валідацію email-адрес, відправляє повідомлення на пошту з підтвердженням реєстрації, а також здійснює валідацію інших полів форми, і багато ще всього.
І навіть після того як ви все це напишіть, користувачі будуть реєструватися неохоче, тому що це вимагає певних зусиль з їхнього боку.
У цьому уроці, ми створимо дуже просту систему реєстрації, яка не вимагає і не зберігає паролі взагалі! Результат буде легко змінити і додати до вже існуючого PHP-сайту. Хочете з'ясувати, як це працює? Читайте нижче.
Ось як наша супер проста система буде працювати:
Ми скомбініруем форму авторизації і реєстрацію. У цій формі буде поле для введення email-адреси і кнопка реєстрації; - При заповненні поля email-адресою, після натискання на кнопку реєстрації буде створена запис про новий користувача, але тільки в тому випадку, якщо введеного email-адреси не було знайдено в базі даних.
Після цього створюється якийсь випадковий унікальний набір символів (токен), який відправляється на вказану користувачем пошту у вигляді посилання, яка буде актуальна протягом 10 хвилин; - За посиланням користувач переходить на наш сайт. Система визначає наявність токена і авторизує користувача;
Переваги такого підходу:
Не потрібно зберігати паролі і здійснювати валідацію полів; - Немає необхідності у відновленні пароля, секретних питань і т.д .; - З моменту як користувач зареєструвався / авторизувався ви можете завжди бути впевнені, що цей користувач буде у вашій зоні доступу (що email-адреса є істинним); - Неймовірно простий процес реєстрації;
недоліки:
Безпека аккаунта користувача. Якщо хтось має доступ до пошти користувача, він може авторизуватися. - Email не захищений і може бути перехоплений. Майте на увазі, що це питання актуальне і в разі, коли пароль був забутий і його необхідно відновити, або в будь-якій системі авторизації, яка не використовує HTTPS для передачі даних (логін / пароль); - Поки ви налаштуєте як потрібно поштовий сервер, існує шанс, що повідомлення з посиланнями на авторизацію будуть потрапляти в спам;
Порівнюючи переваги і недоліки нашої системи, можна сказати, що система має високу юзабіліті (максимально зручна для кінцевого користувача) і, в той же час, має невисокий показник безпеки.
Так що використовувати її пропонується для реєстрацій на форумах і сервісах, які не працюють з важливою інформацією.
Як користуватися цією системою
У разі, коли вам потрібно просто використовувати систему для авторизації користувачів на вашому сайті, і вам не хочеться розбирати даний урок по кісточках, ось що вам потрібно зробити:
Вам потрібно завантажити вихідні, прикладені до уроку - В архіві знайти файл tables.sql Імпорт його в вашу базу даних використовуючи опцію імпорту в phpMyAdmin. Альтернативний спосіб: відкрити цей файл через текстовий редактор, скопіювати SQL запит і виконати його; - Відкрити includes / main.php і заповнити настройки зв'язку з вашою базою даних (вказати користувача і пароль для зв'язку з базою а також хост і ім'я бази). У цьому ж файлі, ви також повинні вказати email, який буде використаний в якості оригінального адреси для повідомлень, що відправляються системою. Деякі хости блокують вихідні мейли поки в формі не буде вказано справжній email адреса, який був створений з панелі управління хостом, так що вкажіть реальну адресу; - Завантажте всі файли index.php, protected.php і папки assets і includes через FTP на ваш хост; - Додайте код нижче на кожну PHP-сторінку, де потрібно відобразити форму авторизації;
Require_once "includes / main.php"; $ User \u003d new User (); if (! $ user- & gtloggedIn ()) (redirect ( "index.php");) - Готово!
Для тих же, кому цікаво, як це все працює - вперед до читання нижче!
Перший крок - написання HTM- коду форми авторизації. Даний код розташовується в файлі index.php. Цей файл також містить PHP-код, що обробляє дані форми та інші корисні функції системи авторизації. Дізнатися про це більше можна в розділі нижче, присвяченому огляду PHP коду.
index.php
Tutorial: Super Simple Registration System With PHP & MySQL
У головній секції (між тегами
і) Я підключив основні стилі (в цьому уроці вони не розбираються, тому ви можете подивитися їх самі. Папка assets / css / style.css). До закриває тега
я підключив бібліотеку jQuery і файл script.js, який ми напишемо і розберемо трохи нижче.
JavaScript
jQuery відстежує стан кнопки "Зареєструватися / авторизуватися" за допомогою функції e.preventDefault () і відправляє AJAX-запити. Залежно від відповіді сервера, виводить ту чи іншу повідомлення і визначає подальші дії /
був доданий в форму для відображення поточного стану AJAX-запиту (це стало можливим завдяки методам ajaxStart ()) і ajaxComplete (), Які ви зможете знайти ближче до кінця файлу).
Цей клас показує крутиться анімований gif-файл (як би натякає нам на те, що запит обробляється), і також виступає як прапор, що запобігає повторне надсилання форми (коли кнопка зареєструватися була вже одного разу натиснута). клас .loggedIn - це інший прапор, - встановлюється тоді, коли був відправлений email. Цей прапор моментально блокує будь-які подальші дії з формою.
Схема бази даних
Наша неймовірно проста система реєстрації використовує 2 MySQL таблиці (SQL-код знаходиться в файлі tables.sql). Перша зберігає дані про акаунти користувачів. Друга зберігає інформацію про кількість спроб входу.
Схема таблиці користувачів.
Система не використовує паролів, що видно на схемі. На ній же можна побачити колонку token з токенами, що є сусідами з колонкою token_validity. Токен встановлюється як тільки користувач підключається до системи, задає свій email для відправки повідомлення (трохи докладніше про це в наступному блоці). колонка token_validity встановлює час на 10 хвилин пізніше, після якого токен перестає бути актуальним.
Схема таблиці, яка вважає кількість спроб авторизації.
В обох таблицях IP-адреса зберігається в обробленому вигляді, за допомогою функції ip2long в поле типу integer.
Тепер ми можемо написати трошки PHP-коду. Основний функціонал системи покладено на клас User.class.php, Який ви можете бачити нижче.
Даний клас активно використовує idorm (docs), ці бібліотеки є мінімально необхідними інструментами, для роботи з базами даних. Він обробляє доступ до бази даних, генерацію токенов і їх валідацію. Він являє собою простий інтерфейс, що дозволяє легко підключити систему реєстрації до вашого сайту, якщо він використовує PHP.
User.class.php
Class User (// Приватний ORM випадок private $ orm; / ** * Знайти користувача по токені. Тільки валідниє токени, прийняті до розгляду. Токен генерується тільки на 10 хвилин з того моменту як був створений * @param string $ token. Це шуканий токен * @return User. Повернути значення функції User * / public static function findByToken ($ token) (// знайти токен в базі і переконатися, що встановлений коректний тимчасової штамп $ result \u003d ORM :: for_table ( "reg_users") -\u003e where ( "token", $ token) -\u003e where_raw ( "token_validity\u003e NOW ()") -\u003e find_one (); if (! $ result) (return false;) return new User ($ result);) / ** * авторизувати або зареєструвати користувача * @param string $ email. Призначений для користувача email-адреса * @return User * / public static function loginOrRegister ($ email) (// Якщо такий користувач вже існує, повернути значення функції User від заданого email-адреси зберігається в базі if (User :: exists ($ email)) (return new User ($ email);) // В іншому випадку створити нового користування земельними діл теля в базі і повернути значення функції User :: create від зазначеного email return User :: create ($ email); ) / ** * Створити нового користувача і зберегти в базу * @param string $ email. Призначений для користувача email-адреса * @return User * / private static function create ($ email) (// Записати нового користувача і повернути результат функції User від цих значень $ result \u003d ORM :: for_table ( "reg_users") -\u003e create (); $ result-\u003e email \u003d $ email; $ result-\u003e save (); return new User ($ result);) / ** * Перевірити, чи існує такий користувач в базі і повернути логічне значення змінної * @param string $ email. Призначений для користувача email-адреса * @return boolean * / public static function exists ($ email) (// Чи існує користувач в базі? $ Result \u003d ORM :: for_table ( "reg_users") -\u003e where ( "email", $ email) -\u003e count (); return $ result \u003d\u003d 1;) / ** * Створити новий користувальницький об'єкт * @param екземпляр $ param ORM, id, email or 0 * @return User * / public function __construct ($ param \u003d null) (if ($ param instanceof ORM) (// ORM перевірка пройдена $ this-\u003e orm \u003d $ param;) else if (is_string ($ param)) (// Перевірка на email пройдена $ this-\u003e orm \u003d ORM :: for_table ( "reg_users") -\u003e where ( "email", $ param) -\u003e find_one ();) else ($ id \u003d 0; if (is_numeric ($ param)) (// код користувача передається значення змінної $ param $ id \u003d $ param;) else if (isset ($ _ SESSION [ "loginid"])) (// В іншому випадку дивись сесію $ id \u003d $ _SESSION [ "loginid"];) $ this-\u003e orm \u003d ORM :: for_table ( "reg_users") -\u003e where ( "id", $ id) -\u003e find_one ();)) / ** * Згенерувати новий SHA1 токен авторизації, записує в базу і повертає його значення * @return string * / public function generateToken () (// Згенерувати токен для авторизованого користувача і зберегти його в базу $ token \u003d sha1 ($ this-\u003e email.time (). rand (0, 1000000 )); // Зберегти токен в базі // І помітити його, що він актуальний тільки протягом 10 наступних хвилин $ this-\u003e orm-\u003e set ( "token", $ token); $ This-\u003e orm-\u003e set_expr ( "token_validity", "ADDTIME (NOW ()," 0:10 ")"); $ This-\u003e orm-\u003e save (); return $ token; ) / ** * Авторизувати користувача * @return void * / public function login () (// Відзначити користувача, як авторизованого $ _SESSION [ "loginid"] \u003d $ this-\u003e orm-\u003e id; // Оновити значення поля бази last_login $ this-\u003e orm-\u003e set_expr ( "last_login", "NOW ()"); $ this-\u003e orm-\u003e save ();) / ** * Знищити сесію і разлогініть користувача * @return void * / public function logout () ($ _SESSION \u003d array (); unset ($ _ SESSION);) / ** * Перевірка, чи заходив користувач * @return boolean * / public function loggedIn () (return isset ($ this-\u003e orm-\u003e id) && $ _SESSION [ "loginid"] \u003d\u003d $ this-\u003e orm-\u003e id;) / ** * Перевірка чи є користувач адміністратором * @return boolean * / public function isAdmin () (return $ this-\u003e rank () \u003d \u003d "administrator";) / ** * Знайти тип користувача, може бути або administrator або regular * @return string * / public function rank () (if ($ this-\u003e orm-\u003e rank \u003d\u003d 1) (return "administrator ";) return" regular ";) / ** * Метод дозволяє отримати приватну інфор мацію користувача в * якості властивостей об'єкта User * @param string $ key Ім'я властивості, що одержує доступ * @return mixed * / public function __get ($ key) (if (isset ($ this-\u003e orm -\u003e $ key)) (return $ this-\u003e orm -\u003e $ key; ) Return null; ))
Токени генеруються за допомогою SHA1 алгоритму і зберігаються в базі даних. Я використовую функції часу MySQL, щоб задати 10-хвилинне обмеження актуальності токена.
Коли токен проходить процедуру валідації, ми безпосередньо говоримо оброблювачу, що ми розглядаємо тільки маркери, у яких ще не закінчився термін придатності, що зберігається в стовпці token_validity.
Зверніть увагу, що я використовую чарівний метод __get бібліотеки docs в кінці файлу, щоб перехопити доступ до властивостей об'єкта User.
Завдяки цьому стає можливим отримати доступ до інформації, що зберігається в базі, завдяки властивостям $ User-\u003e email, $ user-\u003e token і ін. В наступному фрагменті коду розглянемо для прикладу, як використовувати ці класи.
захищена сторінка
Ще один файл, який зберігає корисний і необхідний функціонал - це файл functions.php. Тут є кілька так званих хелперів - функцій-помічників, які дозволяють створювати більш чистий і читабельний код в інших файлах.
functions.php
Function send_email ($ from, $ to, $ subject, $ message) (// Хелпер, що відправляє email $ headers \u003d "MIME-Version: 1.0". "\\ R \\ n"; $ headers. \u003d "Content-type: text / plain; charset \u003d utf-8 "." \\ r \\ n "; $ headers. \u003d" From: ". $ from." \\ r \\ n "; return mail ($ to, $ subject, $ message, $ headers );) function get_page_url () (// Визначити URL PHP-файлу $ url \u003d "http". (empty ($ _ SERVER [ "HTTPS"])? "": "s"). ": //". $ _ SERVER [ "SERVER_NAME"]; if (isset ($ _ SERVER [ "REQUEST_URI"]) && $ _SERVER [ "REQUEST_URI"]! \u003d "") ($ url. \u003d $ _SERVER [ "REQUEST_URI"];) else ($ url. \u003d $ _SERVER [ "PATH_INFO"];) return $ url;) function rate_limit ($ ip, $ limit_hour \u003d 20, $ limit_10_min \u003d 10) (// Кількість спроб входу за останню годину з цього IP-адресою $ count_hour \u003d ORM: : for_table ( "reg_login_attempt") -\u003e where ( "ip", sprintf ( "% u", ip2long ($ ip))) -\u003e where_raw ( "ts\u003e SUBTIME (NOW ()," 1:00 ")") -\u003e count (); // Кількість спроб входу за останні 10 хвилин з цього IP-адресою $ count_10_min \u003d ORM :: for_table ( "reg_login_attempt") -\u003e where ( "ip", sprint f ( "% u", ip2long ($ ip))) -\u003e where_raw ( "ts\u003e SUBTIME (NOW ()," 0:10 ")") -\u003e count (); if ($ count_hour\u003e $ limit_hour || $ count_10_min\u003e $ limit_10_min) (throw new Exception ( "Too many login attempts!");)) function rate_limit_tick ($ ip, $ email) (// Створити новий запис в таблиці, яка вважає кількість спроб входу $ login_attempt \u003d ORM :: for_table ( "reg_login_attempt") -\u003e create (); $ login_attempt-\u003e email \u003d $ email; $ login_attempt-\u003e ip \u003d sprintf ( "% u", ip2long ($ ip)); $ login_attempt-\u003e save ();) function redirect ($ url) (header ( "Location: $ url"); exit;)
функції rate_limit і rate_limit_tick стежать за кількістю спроб авторизації за минулий період часу з моменту першої спроби. Спроба входу записується в базі в стовпець reg_login_attempt. Ці функції викликаються коли відбувається обробка і відправка даних форми як ви можете бачити з наступного фрагмента коду.
Код нижче узятий з файлу index.php і він обробляє надсилання форми. Він повертає JSON-відповідь, який, в свою чергу, обробляється jQuery в файлі assets / js / script.js, Який ми вже розбирали раніше.
index.php
Try (if (! Empty ($ _ POST) && isset ($ _ SERVER [ "HTTP_X_REQUESTED_WITH"])) (// Output a JSON header header ( "Content-type: application / json"); // Чи є цей email-адреса дійсним if (! isset ($ _ POST [ "email"]) ||! filter_var ($ _ POST [ "email"], FILTER_VALIDATE_EMAIL)) (throw new Exception ( "Please enter a valid email.");) // Перевірка. чи дозволено користувачеві авторизуватися, чи не перевищив він кількість допустимих підключень? (файл functions.php для більшої інформації) rate_limit ($ _ SERVER [ "REMOTE_ADDR"]); // Записати цю спробу авторизації rate_limit_tick ($ _ SERVER [ "REMOTE_ADDR"], $ _POST [ "email"]); // Написати листа користувачеві $ message \u003d ""; $ email \u003d $ _POST [ "email"]; $ subject \u003d "Your Login Link"; if (! User :: exists ($ email) ) ($ subject \u003d "Thank You For Registering!"; $ message \u003d "Thank you for registering at our site! \\ n \\ n";) // Спроба авторизувати або зареєструвати користувача $ user \u003d User :: loginOrRegister ($ _ POST [ "email"]); $ message. \u003d "You can login from this URL: \\ n" ; $ Message. \u003d Get_page_url (). "? Tkn \u003d". $ User-\u003e generateToken (). "\\ N \\ n"; $ Message. \u003d "The link is going expire automatically after 10 minutes."; $ Result \u003d send_email ($ fromEmail, $ _POST [ "email"], $ subject, $ message); if (! $ result) (throw new Exception ( "There was an error sending your email. Please try again.");) die (json_encode (array ( "message" \u003d\u003e "Thank you! We \\" ve sent a link to your inbox. Check your spam folder as well. ")));)) catch (Exception $ e) (die (json_encode (array (" error "\u003d\u003e 1," message "\u003d\u003e $ e-\u003e getMessage () )));)
Після успішної авторизації / реєстрації код вище відправить користувачеві посилання для авторизації. Токен стає доступним, тому що він передається в якості змінної в генерується посиланням методом $ _GET з маркером tkn
index.php
If (isset ($ _ GET [ "tkn"])) (// Чи є цей токен дійсним для авторизації? $ User \u003d User :: findByToken ($ _ GET [ "tkn"]); if ($ user) (// Так , є. Здійснити редирект на захищену сторінку $ user-\u003e login (); redirect ( "protected.php");) // Ні, токен не дійсний. Здійснити редирект, на сторінку з формою авторизації / реєстрації redirect ( "index.php ");)
$ User-\u003e login ()
створить необхідні змінні для сесії, так що користувач, переглядаючи наступні сторінки сайту, буде весь час залишатися авторизованим.
Схожим чином влаштована і обробка функції на вихід з системи.
index.php
If (isset ($ _ GET [ "logout"])) ($ user \u003d new User (); if ($ user-\u003e loggedIn ()) ($ user-\u003e logout ();) redirect ( "index.php") ;)
В кінці коду, я знову поставив редирект на index.php, таким чином параметр ? Logout \u003d 1 переданий за допомогою URL не потрібно.
наш файл index.php вимагає доп. захисту - ми не хочемо, щоб люди, які коли-небудь одного разу авторизувалися в системі знову бачили форму реєстрації. Для цих цілей, ми використовуємо метод $ User-\u003e loggedIn ().
index.php
$ User \u003d new User (); if ($ user-\u003e loggedIn ()) (redirect ( "protected.php");)
Нарешті, ось шматок коду, що дозволяє захистити сторінки вашого сайту і зробити її доступною тільки після авторизації.
protected.php
// Щоб захистити кожну сторінку на вашому сайті підключіть до неї файл // main.php і створіть новий об'єкт User. Ось як це просто! require_once "includes / main.php"; $ User \u003d new User (); if (! $ user-\u003e loggedIn ()) (redirect ( "index.php");)
Після цієї перевірки можете бути впевненими, що користувач був успішно авторизований. Ви також можете отримати доступ до інформації, що зберігається в базі за допомогою властивостей об'єкта $ user. Для виведення email-а користувача і його статусу використовуйте цей код:
метод rank () використовується тут тому що в базі зазвичай зберігаються номера (0 для звичайного користувача, 1 для адміністратора) і нам потрібно перетворити ці дані в статуси, до яких вони належать, в чому нам і допомагає цей метод.
Щоб зробити зі звичайного користувача адміністратора, просто відредагуйте запис користувача через phpMyAdmin (або будь-яку іншу програму, що дозволяє управляти базами даних). Статус адміністратора не дає будь-яких привілеїв, в даному прикладі на сторінці буде виведено, що ви адміністратор - і все.
А ось що з цим робити - залишається вже на ваш розсуд, ви можете самі написати і скласти код, що задає певні привілеї і можливості для адміністраторів.
Ми закінчили!
З цієї неймовірно супер квазі простою формою ми закінчили! Ви можете використовувати її в ваших PHP-сайтах, це досить просто. Також ви можете модифікувати її під себе і зробити її такою, як ви хочете.
Матеріал підготував Денис Малишок спеціально для сайту сайт
P.S. Хочете рухатися далі в освоєнні PHP і ООП? Зверніть увагу на преміум-уроки по різним аспектам сайтобудування, включаючи програмування на PHP, а також на безкоштовний курс по створенню своєї CMS-системи на PHP з нуля з використанням ООП:
Сподобався матеріал і хочете віддячити? Просто поділіться з друзями і колегами!
1. Почнемо зі створення таблички users в базі. Вона буде містити дані користувача (логін і пароль). Зайдемо в phpmyadmin (якщо ви створюєте базу на своєму ПК http: // localhost / phpmyadmin /). створюємо таблицю users, В ній буде 3 поля.
Я створюю її в базі mysql, ви можете створювати в іншій базі. Далі встановлюємо значення, як на малюнку:
натискаємо " зберегти". Отже, таблиця у нас є. 2. Необхідно з'єднання з цією таблицею. Давайте створимо файл bd.php. Його зміст:
У моєму випадку це виглядає так:
Зберігаємо bd.php. Відмінно! У нас є таблиця в базі, з'єднання до неї. Тепер можна приступати до створення сторінки, на якій користувачі будуть залишати свої дані. 3. Створюємо файл reg.php з вмістом (всі коментарі всередині):