Інтернет Windows Android

Написати реєстрацію на 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

Login or Register

Enter your email address above and we will send
you a login link.



У головній секції (між тегами і) Я підключив основні стилі (в цьому уроці вони не розбираються, тому ви можете подивитися їх самі. Папка assets / css / style.css). До закриває тега

я підключив бібліотеку jQuery і файл script.js, який ми напишемо і розберемо трохи нижче.


JavaScript

jQuery відстежує стан кнопки "Зареєструватися / авторизуватися" за допомогою функції e.preventDefault () і відправляє AJAX-запити. Залежно від відповіді сервера, виводить ту чи іншу повідомлення і визначає подальші дії /

assets / js / script.js

$ (Function () (var form \u003d $ ( "# login-register"); form.on ( "submit", function (e) (if (form.is ( ". Loading, .loggedIn")) (return false ;) var email \u003d form.find ( "input"). val (), messageHolder \u003d form.find ( "span"); e.preventDefault (); $ .post (this.action, (email: email), function (m) (if (m.error) (form.addClass ( "error"); messageHolder.text (m.message);) else (form.removeClass ( "error"). addClass ( "loggedIn"); messageHolder. text (m.message);)));)); $ (document) .ajaxStart (function () (form.addClass ( "loading");)); $ (document) .ajaxComplete (function () (form. removeClass ( "loading");));));

був доданий в форму для відображення поточного стану 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-а користувача і його статусу використовуйте цей код:

Echo "Your email:". $ User-\u003e email; echo "Your rank:". $ user-\u003e rank ();

метод 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 з вмістом (всі коментарі всередині):
Реєстрація

Реєстрація




4. Створюємо файл, який буде заносити дані в базу і зберігати користувача. save_user.php(Коментарі всередині):

5. Тепер наші користувачі можуть реєструватися! Далі необхідно зробити "двері" для входу на сайт вже зареєстрованим користувачам. index.php (Коментарі всередині):
Головна сторінка

Головна сторінка


зареєструватися


";) Else (// Якщо не порожні, то ми виводимо посилання echo" Ви увійшли на сайт, як ". $ _ SESSION [" login "]."
Це посилання доступна тільки зареєстрованим користувачам ";)?\u003e


У файлі index.php ми виведемо посилання, яка буде відкрита тільки для зареєстрованих користувачів. В цьому і полягає вся суть скрипта - обмежити доступ до будь-яких даних.
6. Залишився файл з перевіркою введеного логіна і пароля. testreg.php (Коментарі всередині):

Ну от і все! Може урок і нудний, але дуже корисний. Тут показана тільки ідея реєстрації, далі Ви можете вдосконалити її: додати захист, оформлення, поля з даними, завантаження аватарів, вихід з облікового запису (для цього просто знищити змінні з сесії функцією unset) і так далі. Успіхів!

Все перевірив, працює справно!

Hello, friends in this tutorial we will learn user registration and login using PHP stored procedure.
File structure for this tutorial
config.php
index.php
check_availability.php
login.php
welcome.php
logout.php
Structure of sql table tblregistration

CREATE TABLE `tblregistration` (` id` int (11) NOT NULL, `FullName` varchar (200) NOT NULL,` EmailId` varchar (200) NOT NULL, `Password` varchar (255) NOT NULL,` RegDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE \u003d InnoDB DEFAULT CHARSET \u003d latin1;

config.php

Create db configuration file using mysqli extension. Provide credential as per your configuration

index.php

Create a html form for user registration.

Register

Already registered. login here

Jquery / Ajax for user email availability

check_availability.php

In this page we will check the user email availability. Create a store procedure with name check availability
Store procedure code:

DELIMITER $ CREATE DEFINER \u003d `root` @` localhost` PROCEDURE `checkavailbilty` (IN` email` VARCHAR (255)) NO SQL SELECT EmailId FROM tblregistration WHERE EmailId \u003d email $ DELIMITER;

Now create a store procedure for user registration.
Store procedure for user registration

DELIMITER $ CREATE DEFINER \u003d `root` @` localhost` PROCEDURE `registration` (IN` fname` VARCHAR (200), IN `emailid` VARCHAR (200), IN` password` VARCHAR (255)) NO SQL insert into tblregistration ( FullName, EmailId, Password) VALUES (fname, emailid, password) $ DELIMITER;

After creation of store procedure execute the store procedure.

";) Else (echo""; } } ?>

Here is the full code that we have written for registration ( index.php):

alert("Registration Successfull");";) Else (echo""; } } ?> Registration using Store Procedure

Register

Already registered. login here



login .php

Create a login form user login.

Now create a store procedure for login with name login.
Login store procedure:

DELIMITER $ CREATE DEFINER \u003d `root` @` localhost` PROCEDURE `login` (IN` useremail` VARCHAR (255), IN `password` VARCHAR (255)) NO SQL SELECT EmailId, Password from tblregistration where EmailId \u003d useremail and Password \u003d password $ DELIMITER;

Now execute the login store procedure

"; $ Extra \u003d" login.php ";))?\u003e

Here is the full code that we have written for login ( login.php):

0) ($ _SESSION [ "login"] \u003d $ _ POST [ "useremail"]; header ( "location: welcome.php");) else ($ _SESSION [ "login"] \u003d $ _ POST [ "useremail"]; echo ""; $ Extra \u003d" login.php ";))?\u003e Sasa Login Store Procedure



welcome.php

After login user will redirect to welcome.php page. We will validate this page with the session if any user try to access this page (welcome.php) directly then user will redirect to login.php page.

Welcome Page

Welcome:

Logout


logout.php

For destroying login session. session_destroy will destroy all the active sessions.

Процес створення системи реєстрації - це досить великий обсяг роботи. Вам потрібно написати код, який би перевіряв валідність 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


-\u003e where ( "token", $ token)
-\u003e where_raw ( "token_validity\u003e NOW ()")
-\u003e find_one ();

If (! $ Result) (
return false;
}

Return new User ($ result);
}

/**
* Either login or register a user.
* @Return User
*/

Public static function loginOrRegister ($ email) (

// If such a user already exists, return it

If (User :: exists ($ email)) (
return new User ($ email);
}

// Otherwise, create it and return it

Return User :: create ($ email);
}

/**
* Create a new user and save it to the database
* @Param string $ email The user "s email address
* @Return User
*/

Private static function create ($ email) (

// Write a new user to the database and return it

$ Result \u003d ORM :: for_table ( "reg_users") -\u003e create ();
$ Result-\u003e email \u003d $ email;
$ Result-\u003e save ();

Return new User ($ result);
}

/**
* Check whether such a user exists in the database and return a boolean.
* @Param string $ email The user "s email address
* @Return boolean
*/

Public static function exists ($ email) (

// Does the user exist in the database?
$ Result \u003d ORM :: for_table ( "reg_users")
-\u003e where ( "email", $ email)
-\u003e count ();

Return $ result \u003d\u003d 1;
}

/**
* Create a new user object
* @Param $ param ORM instance, id, email or null
* @Return User
*/

Public function __construct ($ param \u003d null) (

If ($ param instanceof ORM) (

// An ORM instance was passed
$ This-\u003e orm \u003d $ param;
}
else if (is_string ($ param)) (

// An email was passed
$ This-\u003e
-\u003e where ( "email", $ param)
-\u003e find_one ();
}
else (

If (is_numeric ($ param)) (
// A user id was passed as a parameter
$ Id \u003d $ param;
}
else if (isset ($ _ SESSION [ "loginid"])) (

// No user ID was passed, look into the sesion
$ Id \u003d $ _SESSION [ "loginid"];
}

$ This-\u003e orm \u003d ORM :: for_table ( "reg_users")
-\u003e where ( "id", $ id)
-\u003e find_one ();
}

/**
* Generates a new SHA1 login token, writes it to the database and returns it.
* @Return string
*/

Public function generateToken () (
// generate a token for the logged in user. Save it to the database.

$ Token \u003d sha1 ($ this-\u003e email.time (). Rand (0, 1000000));

// Save the token to the database,
// and mark it as valid for the next 10 minutes only

$ 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;
}

/**
* Login this user
* @Return void
*/

Public function login () (

// Mark the user as logged in
$ _SESSION [ "loginid"] \u003d $ this-\u003e orm-\u003e id;

// Update the last_login db field
$ This-\u003e orm-\u003e set_expr ( "last_login", "NOW ()");
$ This-\u003e orm-\u003e save ();
}

/**
* Destroy the session and logout the user.
* @Return void
*/

Public function logout () (
$ _SESSION \u003d array ();
unset ($ _ SESSION);
}

/**
* Check whether the user is logged in.
* @Return boolean
*/

Public function loggedIn () (
return isset ($ this-\u003e orm-\u003e id) && $ _SESSION [ "loginid"] \u003d\u003d $ this-\u003e orm-\u003e id;
}

/**
* Check whether the user is an administrator
* @Return boolean
*/

Public function isAdmin () (
return $ this-\u003e rank () \u003d\u003d "administrator";
}

/**
* Find the type of user. It can be either admin or regular.
* @Return string
*/

Public function rank () (
if ($ this-\u003e orm-\u003e rank \u003d\u003d 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-\u003e orm -\u003e $ key)) (
return $ this-\u003e orm -\u003e $ key;
}

Return null;
}
}
Token-и генеруються за допомогою алгоритму, і зберігаються в базу даних. Ми використовуємо з MySQL для установки значення в колонку token_validity, рівного 10 хвилинам. При валідації token, ми повідомляємо движку, що нам потрібен token, поле token_validity поки ще не минув. Таким чином ми обмежуємо час, протягом якого token буде валиден.

Зверніть увагу на те, що ми використовуємо чарівний метод __get () в кінці документа, щоб отримати доступ до властивостей об'єкта user. Це дозволяє нам здійснити доступ до даних, які зберігаються в базі даних у вигляді властивостей: $ user-\u003e email, $ user-\u003e token. Для прикладу давайте подивимося, як ми можемо використовувати цей клас в наступному фрагменті коду:


Ще один файл, в якому зберігається необхідний функціонал, це functions.php. Там у нас є кілька допоміжних функцій, які дозволяють нам зберегти решті код більш охайним.

Functions.php

Function send_email ($ from, $ to, $ subject, $ message) (

// Helper function for sending 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 () (

// Find out the URL of a PHP file

$ 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) (

// The number of login attempts for the last hour by this IP address

$ Count_hour \u003d ORM :: for_table ( "reg_login_attempt")
->
-\u003e where_raw ( "ts\u003e SUBTIME (NOW ()," 1:00 ")")
-\u003e count ();

// The number of login attempts for the last 10 minutes by this IP address

$ Count_10_min \u003d ORM :: for_table ( "reg_login_attempt")
-\u003e where ( "ip", sprintf ( "% 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) (

// Create a new record in the login attempt table

$ 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

If (! Empty ($ _ POST) && isset ($ _ SERVER [ "HTTP_X_REQUESTED_WITH"])) (

// Output a JSON header

Header ( "Content-type: application / json");

// Is the email address valid?

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"]);

// Send the message to the user

$ 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";
}

// Attempt to login or register the person
$ 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 ()
)));
}
При успішній авторизації або реєстрації, вищенаведений код відсилає email людині з посиланням для авторизації. Token (лексема) стає доступною в якості $ _GET-змінної "tkn" з огляду на згенерованого URL.

index.php

If (isset ($ _ GET [ "tkn"])) (

// Is this a valid login token?
$ User \u003d User :: findByToken ($ _ GET [ "tkn"]);

// Yes! Login the user and redirect to the protected page.

$ User-\u003e login ();
redirect ( "protected.php");
}

// Invalid token. Redirect back to the login form.
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

// 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 \u003d new User ();

if (! $ user-\u003e loggedIn ()) (
redirect ( "index.php");
}
Після цієї перевірки ви можете бути впевнені в тому, що користувач успішно авторизувався. У вас також буде доступ до даних, які зберігаються в базі даних як властивостей об'єкта $ user. Щоб вивести email користувача та їх ранг, скористайтеся наступним кодом:

Echo "Your email:". $ User-\u003e email;
echo "Your rank:". $ user-\u003e rank ();
Тут rank () - це метод, так як колонка rank в базі даних зазвичай містить числа (0 для звичайних користувачів і 1 для адміністраторів), і нам потрібно перетворити це все в назви рангів, що реалізується за допомогою даного методу. Щоб перетворити звичайного користувача в адміністратора, просто відредагуйте запис про користувача в phpmyadmin (або в будь-який інший програмі по роботі з базами даних). Будучи адміністратором, користувач не буде наділений якимись особливими можливостями. Ви самі в праві вибирати, яким правами наділяти адміністраторів.

Готово!

На цьому наш простенький система реєстрації готова! Ви можете використовувати її на вже існуючому PHP-сайті, або модернізувати її, дотримуючись власних вимог.