Создавање едноставен систем за регистрација на корисници во PHP и MySQL. Изградба на неверојатна едноставна страница за регистрација на PHP и MySQL систем за регистрација на PHP

Reg.ru: домени и хостинг

Најголемиот регистратор и хостинг провајдер во Русија.

Се користат над 2 милиони имиња на домени.

Промоција, пошта за домен, решенија за бизнис.

Повеќе од 700 илјади клиенти ширум светот веќе го направија својот избор.

*Глувчето за паузирање на лизгањето.

Назад напред

Создавање едноставен систем за регистрација на корисници во PHP и MySQL

Создавањето систем за регистрација е многу работа. Мора да напишете код кој ги потврдува адресите на е-пошта, испраќа е-пошта за потврда за регистрација, ги потврдува останатите полиња на формуларот и многу повеќе.

Па дури и откако ќе го напишете сето ова, корисниците ќе не сакаат да се регистрираат, бидејќи. бара одреден напор од нивна страна.

Во ова упатство, ќе создадеме многу едноставен систем за најавување кој воопшто не бара или складира лозинки! Резултатот ќе биде лесен за менување и додавање на веќе постоечка PHP страница. Сакате да дознаете како функционира? Прочитајте подолу.



Еве како би функционирал нашиот супер едноставен систем:

Ќе ги комбинираме формуларот за овластување и регистрацијата. Овој формулар ќе има поле за внесување е-адреса и копче за регистрација;
- При пополнување на полето со е-маил адреса, со кликнување на копчето Регистрирај се ќе се креира запис за нов корисник, но само доколку внесената е-маил адреса не е пронајдена во базата.

После тоа, се креира одреден случаен уникатен сет на знаци (токен), кој се испраќа до поштата наведена од корисникот во форма на врска што ќе биде релевантна 10 минути;
- Со кликнување на врската, корисникот оди на нашата веб-страница. Системот го одредува присуството на токенот и го овластува корисникот;

Предностите на овој пристап:

Нема потреба да чувате лозинки и да ги потврдувате полињата;
- Нема потреба од враќање на лозинката, тајни прашања итн.;
- Од моментот кога корисникот е регистриран/најавен, секогаш можете да бидете сигурни дека овој корисник ќе биде во вашата пристапна зона (дека адресата на е-пошта е вистинита);
- Неверојатно едноставен процес на регистрација;

Недостатоци:

Безбедност на корисничката сметка. Ако некој има пристап до поштата на корисникот, тој може да се најави.
- Е-поштата не е безбедна и може да биде пресретната. Имајте на ум дека ова прашање е исто така релевантно во случај кога лозинката е заборавена и треба да се врати, или во кој било систем за авторизација што не користи HTTPS за пренос на податоци (најава / лозинка);
- Сè додека го поставите серверот за пошта по потреба, постои можност пораките со линкови за авторизација да завршат во спам;

Споредувајќи ги предностите и недостатоците на нашиот систем, можеме да кажеме дека системот има висока употребливост (максимална погодност за крајниот корисник) и, во исто време, има низок безбедносен индикатор.

Затоа се предлага да се користи за регистрации на форуми и сервиси кои не работат со важни информации.

Како да го користите овој систем

Во случај кога само треба да го користите системот за овластување на корисниците на вашата страница, а не сакате да ја разделите оваа лекција, еве што треба да направите:

Треба да ги преземете изворните датотеки прикачени на лекцијата
- Најдете ја датотеката tables.sql во архивата.Увезете ја во вашата база на податоци користејќи ја опцијата за увоз во phpMyAdmin. Алтернативен начин: отворете ја оваа датотека со уредувач на текст, копирајте го SQL барањето и стартувајте ја;
- Отворете го include/main.php и пополнете ги поставките за поврзување со вашата база на податоци (наведете го корисникот и лозинката за поврзување со базата, како и хостот и името на базата). Во истата датотека, мора да наведете и адреса за е-пошта што ќе се користи како оригинална адреса за пораките испратени од системот. Некои домаќини ќе ги блокираат појдовните е-пораки додека формуларот не покаже вистинска адреса за е-пошта што е генерирана од контролната табла на домаќинот, па внесете ја вистинската адреса;
- Поставете ги сите index.php , protected.php датотеки и средства и вклучува папки преку FTP на вашиот домаќин;
- Додајте го кодот подолу на секоја PHP страница каде што сакате да прикажете формулар за авторизација;

Require_once "вклучува/main.php"; $user = нов корисник(); if(!$user->loggedIn())( пренасочување("index.php"); )
- Подготвени!

За оние кои се заинтересирани за тоа како функционира сето тоа, прочитајте подолу!

Првиот чекор е пишување на кодот HTM за формуларот за авторизација. Овој код се наоѓа во датотеката index.php. Оваа датотека го содржи и PHP-кодот што се справува со податоците за формуларот и другите корисни функции на системот за авторизација. Можете да дознаете повеќе за ова во делот за преглед на PHP код подолу.

индекс.php

Упатство: Супер едноставен систем за регистрација со PHP и MySQL Најавете се или регистрирајте се

Внесете ја вашата e-mail адреса погоре и ние ќе ви испратиме
линк за најавување.

Најавете се / Регистрирајте се

Во делот за глава (помеѓу ознаките и) ги вклучив главните стилови (тие не се опфатени во ова упатство, за да можете сами да ги видите. assets/css/style.css папка). Пред ознаката за затворање, ја вклучив библиотеката jQuery и датотеката script.js, кои ќе ги напишеме и анализираме подолу.


JavaScript

jQuery ја следи состојбата на копчето „Sign Up/Login“ со функција e.preventDefault()и испраќа AJAX барања. Во зависност од одговорот на серверот, прикажува одредена порака и одредува понатамошни дејства /

средства/js/script.js

$(function()( var form = $("#login-register"); form.on ("submit", function(e)( if(form.is(".loading, .loggedIn"))( return false ;) var email = form.find ("внес").val (), messageHolder = form.find ("span"); e.preventDefault(); $.post(this.action, (email: email), функција (m)( if(m.error)( form.addClass("грешка"); messageHolder.text(m.порака); ) else( form.removeClass("грешка").addClass ("loggedIn"); messageHolder. текст(м.порака); ) ));)); $(документ).ajaxStart(function()(form.addClass("се вчитува"); ));$(документ).ajaxComplete(function()(форма. removeClass ("се вчитува"); )); ));

беше додаден во формуларот за прикажување на моменталната состојба на барањето AJAX (ова беше овозможено благодарение на методите ajaxStart()) И ajaxComplete(), што можете да го најдете кон крајот на датотеката).

Оваа класа прикажува анимирана гиф-датотека што се врти (како да ни навестува дека барањето се обработува), а исто така делува како знаменце за да спречи повторно испраќање на формуларот (кога копчето за регистрација веќе е кликнато еднаш). Класата .loggedIn е уште едно знаме - поставено кога е испратена е-поштата. Ова знаменце веднаш го блокира секое понатамошно дејство на формуларот.

Шема на база на податоци

Нашиот неверојатно едноставен систем за логирање користи 2 MySQL табели (кодот SQL е во датотеката tables.sql). Првиот складира податоци за кориснички сметки. Вториот складира информации за бројот на обиди за најавување.


Шема на табела за корисници.

Системот не користи лозинки, што може да се види на дијаграмот. На него, исто така можете да ја видите колоната за токени со токени во непосредна близина на колоната token_validity. Токенот се поставува веднаш штом корисникот се поврзе со системот, ја поставува неговата е-пошта да испрати порака (малку повеќе за ова во следниот блок). Колоната token_validity го поставува времето на 10 минути подоцна, по што токенот повеќе не е валиден.


Шема на табела што го брои бројот на обиди за авторизација.

Во двете табели, IP адресата е зачувана во обработена форма, користејќи ја функцијата ip2long, во целобројно поле.

Сега можеме да напишеме некој PHP код. Главната функционалност на системот е доделена на класата User.class.php, која можете да ја видите подолу.

Оваа класа активно користи idorm (docs), овие библиотеки се минималните потребни алатки за работа со бази на податоци. Се справува со пристап до базата на податоци, генерирање токени и валидација. Тоа е едноставен интерфејс што го олеснува поврзувањето на системот за регистрација на вашата страница ако користи PHP.

user.class.php

Класа корисник( // Приватен ORM случај приватен $orm; /** * Најдете корисник по токен. Се земаат предвид само валидни токени. Токенот се генерира само 10 минути од моментот кога е креиран * @param string $token Ова е оној што го барате токенот * @return User. Вратете ја вредноста на функцијата Корисник */ јавна статична функција findByToken($token)( // најдете го токенот во базата на податоци и проверете дали е поставен точниот временски печат $ резултат = ORM::for_table ("reg_users") ->каде ("токен", $token) ->where_raw ("token_validity > NOW()") ->find_one();if(!$result)( return false; ) врати нов корисник($result); ) /** * Овластете или регистрирајте корисник * @param string $email.Адреса на е-пошта на корисникот * @return Корисник */јавна статичка функција loginOrRegister($email)( // Ако таков корисник веќе постои, вратете ја вредноста на функцијата Корисник од наведената адреса за е-пошта зачувана во базата на податоци if(User::exists($email))( return new User($email); ) // Во спротивно, креирајте нов корисник во база на податоци и вратете ја вредноста на функцијата User::create од наведената е-пошта враќање User::create($email ); ) /** * Креирајте нов корисник и зачувајте во базата на податоци * @param string $email. Корисничка адреса за е-пошта * @return Корисник */ приватна статична функција креирајте($email)( // Регистрирајте нов корисник и вратете го резултатот од функцијата Корисник од овие вредности $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); врати нов корисник($result); ) /** * Проверете дали таков корисник постои во базата на податоци и вратете ја буловата вредност на променлива * @param стринг $email. Адреса на е-пошта на корисникот * @return boolean */ јавна статичка функција постои($email)( // Дали корисникот постои во базата на податоци? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); врати $result == 1;) /** * Направете нов кориснички објект * @param пример $param ORM , id, email или 0 * @return Корисник */ јавна функција __construct($param = null) ( if($param instanceof ORM)( // ОРМ проверката помина $this->orm = $param; ) else if(is_string($param))( // Проверката на е-пошта помина $this->orm = ORM:: for_table ("reg_users") ->where ("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // ID на корисникот е пренесена вредноста на $ парамен променлива $id = $param; ) else if(isset($_SESSION["loginid"]))( // Во спротивно видете ја сесијата $id = $_SESSION["loginid"]; ) $this->orm = ORM:: for_table ( "reg_users") ->where ("id", $id) ->find_one(); ) ) /** * Генерирајте нов токен за авторизација на SHA1, напишете го во базата на податоци и вратете ја неговата вредност * @return string * / public функција generateToken( )( // Генерирајте токен за овластен корисник и зачувајте го во базата на податоци $token = sha1($this->email.time().rand(0, 1000000)); // Чувајте го токенот во базата на податоци // И означете го како валиден само во следните 10 минути $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); врати $токен; ) /** * Овластете го корисникот * @return void */ јавна функција login()( // Означете го корисникот како најавен $_SESSION["loginid"] = $this->orm->id; // Ажурирајте ја вредноста од полето за база на податоци last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Уништи ја сесијата и одјави го корисникот * @return void */ јавна функција одјавување ()( $_SESSION = низа(); unset($_SESSION); ) /** * Проверете дали корисникот е најавен * @return boolean */ јавна функција logedIn()( return isset($ this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Проверете дали корисникот е администратор * @return boolean */ јавна функција isAdmin() ( return $this->rank() = = "administrator";) /** * Најдете го типот на корисникот, може да биде или администратор или обичен * @return string */ public function rank()( if($this->orm- >ранг == 1)( врати „администратор“; ) врати „обичен“; ) /** * Метод кој ви овозможува да ги добиете приватните информации на корисникот *како својства на објектот Корисник * @param string $key Името на својството што добива пристап * @return мешано */ јавна функција __get($key)( if(isset($this->orm->$key))( return $this->orm->$key; ) врати нула; ))

Токените се генерираат со помош на алгоритмот SHA1 и се складираат во базата на податоци. Ги користам временските функции на MySQL за да поставам ограничување на истекување на токен од 10 минути.

Кога токенот ќе ја помине процедурата за валидација, директно му кажуваме на управувачот дека размислуваме само за токени кои сè уште не се истечени, складирани во колоната token_validity.

Ве молиме имајте предвид дека го користам магичниот метод __земибиблиотека docs на крајот од датотеката за да се пресретне пристапот до својствата на објектот Корисник.

Ова овозможува пристап до информациите зачувани во базата на податоци со користење на $user->email, $user->token и други својства.Во следниот фрагмент од код, ќе разгледаме како да ги користиме овие класи како пример.


Заштитена страница

Друга датотека која складира корисна и неопходна функционалност е датотеката functions.php. Овде има неколку таканаречени помошници - помошни функции кои ви дозволуваат да креирате почист и почитлив код во други датотеки.

функции.php

Функција send_email($from, $to, $subject, $message)( // Помошник што испраќа е-пошта $headers = "MIME-верзија: 1.0" . "\r\n"; $headers .= "Тип на содржина: текст /plain; charset=utf-8" . "\r\n"; $headers .= "Од: ".$from. "\r\n"; врати пошта($to, $subject, $message, $headers ); ) функцијата get_page_url()( // Земете URL-адреса на датотеката PHP $url = "http".(празен($_SERVER["HTTPS"])?"":"s")."://".$_SERVER [ "SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")($url.= $_SERVER["REQUEST_URI"]; ) друго ($url. = $_SERVER["PATH_INFO"]; ) врати $url; ) функција rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Број на обиди за најавување во последниот час на оваа IP адреса $count_hour = ORM: :for_table ("reg_login_attempt") ->where ("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00")") ->count(); // Број на обиди за најавување во последните 10 минути на оваа IP адреса $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long( $ ip))) ->where_raw ("ts > SUBTIME(NOW(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)(фрли нов Исклучок ("Премногу обиди за најавување!"); ) ) функција rate_limit_tick($ip, $email)( // Создадете нов запис во табелата броење на бројот на обиди за најавување $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip) ); $login_attempt->save(); ) функција пренасочување($url)( header(„Локација: $url“); излез; )

Функции стапка_ограничувањеИ стапка_ограничување_штиклирањеследете го бројот на обиди за овластување за изминатиот временски период од првиот обид. Обидот за најавување се запишува во базата на податоци во колоната reg_login_attempt. Овие функции се повикуваат кога податоците од формуларот се обработуваат и доставуваат, како што можете да видите од следниот фрагмент од код.

Кодот подолу е земен од датотеката index.php и се справува со поднесувањето на формуларот. Тој враќа JSON одговор, кој пак се обработува од jQuery во датотеката assets/js/script.js што веќе ја опфативме.

индекс.php

Обидете се( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Изнесете заглавие на JSON („Тип на содржина: апликација/json“); // Дали оваа адреса на е-пошта е валидна ако (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(фрли нов Исклучок ("Ве молиме внесете валидна е-пошта."); ) // Проверете дали е на корисникот му е дозволено да се најави, дали го надминал бројот на дозволени врски? (датотека functions.php за повеќе информации) rate_limit($_SERVER["REMOTE_ADDR"]); // Сними го овој обид за најавување rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Испратете е-пошта до корисникот $message = ""; $email = $_POST["email"]; $subject = "Вашата врска за најава"; if(!Корисник:: постои ($email) )( $subject = "Ви благодариме што се регистриравте!"; $message = "Ви благодариме што се регистриравте на нашата страница!\n\n"; ) // Обидете се да овластите или регистрирате корисник $user = Корисник ::loginOrRegister($_POST[ "email"]);$message.= "Можете да се најавите од оваа URL:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Врската ќе истече автоматски по 10 минути."; $result = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( throw new Exception("Имаше грешка при испраќањето на вашата е-пошта. Ве молиме обидете се повторно."); ) die(json_encode(array("message" => "Ви благодариме! Испративме врска во вашето сандаче. Проверете ја и вашата папка за спам.")))); ) ) catch(Исклучок $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage( )))));)

По успешното овластување/регистрација, горната шифра ќе му испрати на корисникот линк за авторизација. Токенот станува достапен затоа што се пренесува како променлива во генерираната врска со методот $_GETсо маркер tkn

индекс.php

If(isset($_GET["tkn"]))( // Дали овој токен важи за авторизација? $user = Корисник::findByToken($_GET["tkn"]); if($user)( // Да , е. php ");)

$user->login()

ќе ги создаде потребните променливи за сесијата, така што корисникот, гледајќи ги следните страници на страницата, ќе остане овластен цело време.

Слично на тоа, се уредува обработката на функцијата за излез од системот.

индекс.php

If(isset($_GET["logout"]))($user = нов корисник(); if($user->loggedIn())($user->logout(); ) redirect ("index.php") ;)

На крајот од кодот, повторно се пренасочив на index.php, па параметарот ?одјавување=1не е потребно проследено со URL.

Нашата датотека index.php бара дополнителни. заштита - не сакаме луѓето кои некогаш се најавиле на системот повторно да го видат формуларот за регистрација. За овие цели, го користиме методот $user->logedIn().

индекс.php

$user = нов корисник(); if($user->loggedIn())(пренасочи("protected.php"); )

Конечно, еве дел од кодот што ви овозможува да ги заштитите страниците на вашата страница и да ја направите достапна само по овластување.

заштитени.php

// За да ја обезбедите секоја страница на вашата страница, вклучете датотека // main.php и креирајте нов кориснички објект. Така е лесно! require_once "вклучува/главно.php"; $user = нов корисник(); if(!$user->loggedIn())(пренасочи("index.php"); )

По оваа проверка, можете да бидете сигурни дека корисникот е успешно овластен. Можете исто така да пристапите до зачуваните информации во базата на податоци користејќи својства на објектот $user. За да ги прикажете е-поштата и статусот на корисникот, користете го овој код:

echo "Вашата е-пошта: ".$user->email; echo "Вашиот ранг: ".$user->rank();

Метод ранг ()овде се користи бидејќи броевите обично се складираат во базата на податоци (0 за нормален корисник, 1 за администратор) и треба да ги претвориме овие податоци во статуси на кои припаѓаат, што ни помага овој метод.

За да направите обичен корисник администратор, едноставно уредете го корисничкиот запис преку phpMyAdmin (или која било друга програма што ви овозможува да управувате со бази на податоци). Администраторскиот статус не дава никакви привилегии, во овој пример, страницата ќе прикаже дека сте администратор - и тоа е тоа.

Но, што да правите со тоа - останува на ваша дискреција, можете сами да пишувате и составувате код кој поставува одредени привилегии и можности за администраторите.

Завршивме!

Со оваа неверојатно супер квази едноставна форма, завршивме! Можете да го користите во вашите PHP сајтови, тоа е прилично едноставно. Можете исто така да го модифицирате за себе и да го направите онака како што сакате.

Материјалот го подготви Денис Малишок специјално за локацијата на локацијата

П.С. Дали сакате да продолжите понатаму во совладувањето на PHP и OOP? Погледнете ги врвните упатства за различни аспекти на градењето веб-локации, вклучително и програмирање PHP, како и бесплатен курс за градење на вашиот PHP CMS систем од нула користејќи OOP:

Ви се допадна материјалот и сакате да се заблагодарите?
Само споделете со вашите пријатели и колеги!


Последен пат е изменето на 23 јули 2019 година од Винси.

Регистрацијата или регистрирањето на корисникот е составен дел на многу веб-апликации и од клучно значење е да се направи правилно за успехот на апликацијата. Тоа е почетната точка на корисничкиот ангажман со вашата апликација.

Треба да биде што е можно поедноставно со најдобриот UI / UX. Спроведувањето на функционалноста за регистрација на корисници со помош на PHP е едноставна задача и ќе ве проучам низ чекорите со пример во оваа статија.

Што има внатре? Како функционира овој пример за регистрација на корисници на PHP?

Овој пример код може да се подели на 3 дела.

  • Добивање кориснички информации преку HTML форма.
  • Потврдување на информациите доставени од корисникот на формуларот за поднесување.
  • Ракување со база на податоци за да се зачува регистрираниот корисник во базата на податоци по валидацијата.
  • Третиот чекор ќе се изврши откако ќе се осигура дека корисникот веќе не е додаден. Оваа валидација на уникатноста на податоците ќе се изврши врз основа на нивната е-пошта и корисничко име внесени од нив.

    За време на регистрацијата генерално собираме кориснички информации, кои се подготвени да се регистрираат со нашата апликација. Некои од нив ќе бидат задолжителни, а дел ќе бидат опционални.

    Значи, оваа функционалност може да вклучува и дел за валидација за да се осигури непразниноста и форматот на корисничките податоци. Потврдата може да се изврши или на страната на клиентот или на страната на серверот.

    Да се ​​има валидација на страната на серверот е секогаш подобро. Можете да изберете да го имате на страната на клиентот, исто така, за полесно користење на корисниците. Но, имањето на страната на серверот не е опционално и минимално барање.

    структура на датотека

    HTML форма за да му овозможи на корисникот да се регистрира

    Во овој пример, формуларот за регистрација ги содржи полињата Корисничко име, Име (Име на прикажување), Лозинка и Е-пошта. Исто така, го има полето Потврди лозинка за да му дозволи на корисникот повторно да ја внесе лозинката за потврда. Овие две лозинки ќе се споредат подоцна во моментот на .

    Со поднесување на овој формулар, се очекува корисникот да се согласи со условите и правилата. Значи, полето за избор се додава пред копчето Регистрирај се за да се обезбеди.

    Формулар за регистрација на корисник на PHP Пријавете се Корисничко име