internetul Windows. Android

Scrieți înregistrarea la PHP. Crearea unui sistem simplu de înregistrare a utilizatorilor pentru PHP și MySQL

Pentru a împărți vizitatorii site-ului la unele grupuri de pe site, asigurați-vă că ați stabilit un mic sistem Înregistrare cu PHP.. Astfel, sunteți vizitatori convențional împărțiți în două grupuri de vizitatori doar aleatorie și la un grup mai privilegiat de utilizatori care sunt emise mai multe informații valoroase.

În majoritatea cazurilor, utilizați un sistem mai simplificat de înregistrare, care este scris în PHP într-un singur fișier. register.php..

Deci, am fost puțin distrași, și acum luăm în considerare fișierul de înregistrare în detaliu.

Fișier de registru.php.

Pentru ca tu să nu luați masa timpului, să creați un sistem care să colecteze utilizatorii, luând informații minime de contact de la acestea. În acest caz, toată lumea va fi trimisă la baza de date MySQL. Pentru cea mai mare viteză de bază, vom crea un tabel de utilizatori în format Myisam și în codarea UTF-8.

Notă! Trebuie să scrieți toate scripturile într-o singură codificare. Toate fișierele site-ului și baza de date MySQL trebuie să fie într-o singură codificare. Cele mai frecvente codificări UTF-8 și Windows-1251.

Pentru ceea ce aveți nevoie pentru a scrie totul într-o singură codificare, vom vorbi cumva mai târziu. Între timp, luați aceste informații ca cea mai strictă regulă care creează scripturi, altfel vor exista probleme cu activitatea scripturilor. Nimic teribil, desigur, ci pur și simplu pierde în greutate timp pentru a găsi erori în scenariu.

Cum va funcționa scenariul în sine?

Vrem să simplificăm totul și să obținem un rezultat rapid. Prin urmare, vom primi de la utilizatori doar login, e-mail și parola sa. Și pentru a proteja împotriva roboților spamului, instalați o mică captură. În caz contrar, orice băiat de la Londra va scrie un mic parser robot care va umple întreaga bază cu utilizatorii de var în câteva minute și se va bucura de geniul și impunitatea sa.

Iată scenariul în sine. Totul este scris într-un singur fișier. register.php.:

! `; // Întrebarea roșie Mark $ sha \u003d $ sh. "Scripturi / pro /"; // calea către directorul principal $ bg \u003d `bgcolor \u003d" # e1ffeb "`; // linii de culoare fundal?\u003e Exemplu de înregistrare script register.php stil.css "/\u003e

În acest caz, scenariul mă apelează la mine. Și este o formă și un handler de date înregistrate. Îți atrag atenția că fișierul este comprimat de arhiva ZIP și conține fișierul de configurare configurat.php, fișierul de bază al bazei de date utilizator, fișierul care conține funcțiile auxiliare funcții.php, stilul de stil stil.css și fișierul de registru.php el însuși. De asemenea, mai multe fișiere care sunt responsabile pentru munca și generarea de caractere de captare.

Reg.ru: domenii și găzduire

Cel mai mare înregistrator și furnizor de găzduire din Rusia.

Mai mult de 2 milioane de nume de domenii pentru întreținere.

Promovare, poștă pentru un domeniu, soluții de afaceri.

Mai mult de 700 de mii de clienți din întreaga lume și-au făcut deja alegerea.

* Mouse-ul pentru suspendarea derulării.

Inapoi inainte

Crearea unui sistem simplu de înregistrare a utilizatorilor pentru PHP și MySQL

Crearea unui sistem de înregistrare este o treabă mare. Trebuie să scrieți un cod care execută adresele de e-mail, trimite un mesaj la confirmarea corespondenței și, de asemenea, efectuează validarea câmpurilor de formular rămas și multe altele.

Și chiar după ce scrieți toate acestea, utilizatorii se vor înregistra cu reticență, pentru că Acest lucru necesită anumite eforturi din partea lor.

În această lecție, vom crea un sistem foarte simplu de înregistrare care nu necesită și nu stochează parole în general! Rezultatul va fi ușor de schimbat și adăugați la un site PHP existent. Vrei să-ți dai seama cum funcționează? Cititi mai jos.



Iată cum va funcționa sistemul nostru super simplu:

Combinăm forma de autorizare și înregistrare. În acest formular va fi un câmp pentru introducerea unei adrese de e-mail și a unui buton de înregistrare;
- Când completați câmpul Adresa de e-mail, va fi creat un nou utilizator făcând clic pe butonul de înregistrare, dar numai dacă adresa de e-mail introdusă nu se găsește în baza de date.

După aceasta, se creează un anumit set de caractere unice aleatoriu (token), care este trimis utilizatorului specificat de utilizator sub forma unei referințe, care va fi relevantă în termen de 10 minute;
- Prin link, utilizatorul merge pe site-ul nostru. Sistemul determină prezența unui simbol și autorizează utilizatorul;

Avantajele acestei abordări:

Nu este nevoie să stocați parolele și să efectuați validarea câmpului;
- Nu este nevoie să restaurați parola, întrebări secrete etc.;
- din momentul în care utilizatorul a înregistrat / autorizat, puteți fi întotdeauna sigur că acest utilizator va fi în zona dvs. de acces (că adresa de e-mail este adevărată);
- procesul de înregistrare incredibil de simplu;

Dezavantaje:

Securitatea contului de utilizator. Dacă cineva are acces la poștă, se poate conecta.
- Emailul nu este protejat și poate fi interceptat. Rețineți că această întrebare este relevantă și în cazul în care parola a fost uitată și trebuie restabilită sau în orice sistem de autorizare care nu utilizează HTTPS pentru transferul de date (autentificare / parolă);
- în timp ce configurați modul în care aveți nevoie de un server de poștă electronică, există o șansă ca mesajele cu link-uri să autorizeze să fie în spam;

Comparând avantajele și dezavantajele sistemului nostru, se poate spune că sistemul are o gamă mare de yuzabilitate (cea mai convenabilă pentru utilizatorul final) și, în același timp, are un indicator de securitate scăzut.

Deci, utilizați-o este oferită pentru înregistrări pe forumuri și servicii care nu funcționează cu informații importante.

Cum se utilizează acest sistem

În cazul în care trebuie doar să utilizați sistemul pentru a autoriza utilizatorii de pe site-ul dvs. și nu doriți să dezasamblați această lecție pe oase, asta este ceea ce trebuie să faceți:

Trebuie să descărcați sursele atașate la lecție
- găsiți fișierul în arhivă tabele.sql. Importați-l în baza dvs. de date utilizând opțiunea de import în PhpMyAdmin. Oricare alternativă: Deschideți acest fișier printr-un editor de text, copiați interogarea SQL și executați-o;
- Deschis include / Main.php. și completați setările de comunicare cu baza de date (specificați un utilizator și o parolă pentru a comunica cu baza, precum și cu gazda și numele bazei). În același fișier, trebuie să specificați, de asemenea, e-mailul, care va fi folosit ca adresă originală pentru mesajele trimise de sistem. Unele gazde blochează mesajele de ieșire în timp ce formularul nu specifică această adresă de e-mail, care a fost creată din panoul de control al gazdei, deci specificați adresa reală;
- încărcați toate fișierele index.php., protejat.php. Și activele și include foldere prin FTP pe gazda dvs.;
- Adăugați codul de mai jos la fiecare pagină PHP, unde trebuie să afișați formularul de autorizare;

Necesită_once "include / main.php"; $ Utilizator \u003d utilizator nou (); dacă (! $ user- & gtloggedin ()) (redirecționare ("index.php");)
- Gata!

Pentru cei care sunt interesați, cum funcționează totul - înainte de a citi mai jos!

Primul pas este să scrieți codul HTM al formularului de autorizare. Acest cod este situat în fișier. index.php.. Acest fișier conține, de asemenea, un cod PHP care mașinează datele formularului și alte funcții utile ale sistemului de autorizare. Puteți afla mai multe în secțiunea de mai jos dedicată revizuirii codului PHP.

index.php.

Tutorial: Sistem Super Simple de Înregistrare cu PHP & MySQL

Conectați-vă sau înregistrați-vă.

Introduceți adresa dvs. de e-mail de mai sus și vom trimite
aveți un link de conectare.



În secțiunea Head (între etichete și) Am conectat stilurile principale (în această lecție pe care nu le înțeleg, astfel încât le puteți vedea singur. Dosarul Active / CSS / stil.css). La eticheta de închidere

Am conectat biblioteca jQuery și fișierul script.js, pe care îl vom scrie și ne întrebăm mai jos.


JavaScript.

jQuery urmărește starea butonului "Register / autoriie" utilizând funcția e.preventdefault () Și trimite cereri AJAX. În funcție de răspunsul serverului, acesta afișează acest lucru sau respectivul mesaj și determină acțiunile ulterioare /

active / JS / SCRIPT.JS

$ (Funcție () (VAR FORM \u003d $ ("# login-registru"); Form.on ("Trimiteți", Funcția (E) (dacă (Form.is ("Loading, .loggedin")) (return fals ; M) (Form.Addclass ("Eroare"); MassageLholder.Text (M.Message);) altceva (formal.Removeclass ("eroare"). AddClass ("loggedin"); mesaj (M.Message);) ));))); $ (Document) .Ajaxstart (funcția ();)); $ (document) .Ajaxcomplete (funcție () (Formular. RemoveClass ("încărcarea");)));)););

a fost adăugată la formularul de afișare a stării actuale a cererii AJAX (aceasta a devenit posibilă din cauza metodelor ajaxstart ()) I. ajaxComplete ()pe care le puteți găsi mai aproape de sfârșitul fișierului).

Această clasă prezintă un fișier GIF animat de filare (ca și cum ar sugera că cererea este procesată) și acționează ca un steag care împiedică forma de re-trimitere (când butonul de înregistrare a fost deja apăsat o dată). Clasă .conectat. - Acesta este un alt steag, este setat când e-mailul a fost trimis. Acest pavilion blochează instantaneu orice altă acțiune cu forma.

Schema bazei de date.

Sistemul nostru incredibil de simplu de înregistrare utilizează 2 mese MySQL (codul SQL este în fișier tabele.sql.). Primele stochează date despre conturile de utilizator. Cea de-a doua stocare a informațiilor despre numărul de încercări de intrare.


Circuitul tabelului de utilizator.

Sistemul nu utilizează parole, care este vizibil în diagramă. Puteți vedea coloana jeton. cu jetoane adiacente coloanei token_valitate. Tokenul este instalat de îndată ce utilizatorul se conectează la sistem, își stabilește e-mailul pentru a trimite un mesaj (mai puțin despre acest lucru în blocul următor). Coloană token_valitate Setează timpul de 10 minute mai târziu, după care Tokenul încetează să fie relevant.


Circuit de masă, care ia în considerare numărul de încercări de autorizare.

În ambele tabele, adresa IP este stocată în formularul prelucrat utilizând funcția IP2Long în câmpul Integer.

Acum putem scrie un cod PHP mic. Funcționalitatea principală a sistemului este încredințată clasei User.class.php.pe care le puteți vedea mai jos.

Această clasă utilizează în mod activ qorm (Docs), aceste biblioteci sunt instrumente minim necesare pentru a lucra cu baze de date. Ea procesează accesul la baza de date, generarea de jetoane și validarea acestora. Este o interfață simplă care vă permite să conectați cu ușurință sistemul de înregistrare pe site-ul dvs. dacă acesta utilizează PHP.

User.class.php.

Utilizator de clasă (// Caz privat ORM Private $ ORM; / ** * Găsiți un utilizator pe Tocken. Numai jetoanele valide sunt luate în considerare. Tocken este generat doar timp de 10 minute de la * @param string $ token. Acesta este Tocken dorit * @return Utilizator. Returnați valoarea utilizatorului Funcție * / Funcția statică publică FindByToken ($ token) (// Găsiți un jeton în baza de date și asigurați-vă că prețul curent de timp $ rezultat \u003d Orm :: for_table (" Reg_Users ") -\u003e Unde (" token ", $ token) -\u003e unde_raw (" token_valitate\u003e acum () ") -\u003e gind_one (); dacă (! $ Rezultat) (return fals;) Returnați utilizator nou ($ rezultat) ;) / ** * Autorizați sau înregistrați un utilizator * @param String $ email. Adresa de e-mail personalizată * @ utilizator * / adresa publică ($ email) (// Dacă un astfel de utilizator există deja, returnați valoarea funcției utilizatorului de la adresa de e-mail specificată stocată în baza de date dacă (Utilizator :: există ($ email)) (returnați utilizatorul nou ($ email);) // Creați altfel un utilizator nou TV în baza de date și returnați valoarea utilizatorului funcției :: Creați din utilizatorul de returnare de e-mail specificat :: Creați ($ email); ) / ** * Creați un utilizator nou și salvați în baza de date * @param String $ email. Adresa de e-mail a utilizatorului * @ReTurn Utilizator * / Funcție statică privată Creați ($ email) (// Scrieți un utilizator nou și returnați rezultatul funcției utilizatorului de la aceste valori $ rezultat \u003d Orm :: for_table ("reg_Users") - \u003e Creare (); $ rezultat-\u003e email \u003d $ e-mail; $ rezultat-\u003e salvați (); returnați utilizatorul nou ($ rezultat);) / * * Verificați dacă un astfel de utilizator există în baza de date și returnați valoarea variabilă a Variabila * @param String $ email. Adresa de e-mail personalizată * @return boolean * / funcția statică publică există ($ e-mail) (// există un utilizator în baza de date? $ Rezultat \u003d orrm :: for_table ("reg_Users") -\u003e Unde ("Email", $ email ) -\u003e Contele (); Return $ rezultat \u003d\u003d 1;) / ** * Creați un obiect utilizator nou * @param instanță $ PARAM ORM, ID, e-mail sau 0 * @ utilizator utilizator * / funcția publică __construct ($ param \u003d null) (dacă ($ PARAM INIPORTOF ORM) (// verificarea ORM este trecut $ acest-\u003e orrm \u003d $ param; altceva dacă (is_string ($ param)) (// verificarea e-mailului $ acest-\u003e om \u003d om :: FOR_TABLE ("REG_USERS") -\u003e Unde ("Email", $ PARAM) -\u003e Find_One ();) altceva ($ id \u003d 0; dacă (IS_Numeric ($ param)) (// identificatorul utilizatorului este transmis la valoarea lui valoarea $ PARAM $ ID Value \u003d $ param;) altfel dacă (Isset (sesiune de $ _ ["LOGINID"])) (// a se vedea în caz contrar sesiunea $ id \u003d $ _session ["loginid"];) $ Acest-\u003e ORM \u003d Orm :: for_table ("reg_Users") -\u003e Unde ("ID", $ ID) -\u003e Find_one ();)) / ** * Generați noul token de autorizare SHA1, scrie În baza de date și returnează valoarea * @return șir * / funcția publică GenerateToken (// Generați un jeton pentru un utilizator autorizat și salvați-l la $ token \u003d SHA1 ($ acest-\u003e email.Time (). Rand (0) , 1000000)); // salvați jetoanele în baza de date // și marcați-o că este relevantă numai în 10 din următoarele minute $ Acest-\u003e ORM-\u003e Set ("token", $ token); $ acest-\u003e orrm-\u003e set_expr ("token_validy", "addtime (acum ()," 0:10 ")"); $ this-\u003e om-\u003e salvați (); Returnați $ token; ) / ** * Autorizați utilizatorul * @return Void * / funcția publică Login () (// marca un utilizator ca autorizat $ _session ["Loginid"] \u003d $ Acest-\u003e id-\u003e id; // reîmprospătați valoarea de The Last_Login Field de bază $ acest-\u003e om-\u003e set_expr ("last_login", "acum ()"); $ this-\u003e orrm-\u003e salvați ();) / ** * distruge sesiunea și divide utilizatorul * @return Void * / Funcție publică Logout () ($ _session \u003d matrice (); UNSET ($ _ sesiune);) / ** * Verificați dacă utilizatorul a venit * @return boolean * / funcția publică loggedin () (return isset ($ Acest-\u003e ORM-\u003e ID) && $ _session ["loginid"] \u003d\u003d $ this-\u003e orrm-\u003e id;) / ** * verificare este administratorul de utilizator * @return boolean * / funcția publică isadmin () (return $ acest-\u003e rang () \u003d \u003d "administrator";) / * * * găsi un tip de utilizator, poate fie administrator sau regular * @return string * / funcție de funcții publice () (dacă ($ this-\u003e orm-\u003e rang \u003d\u003d 1) (Return "Administrator";) Returnați metoda "Regular";) / ** * vă permite să obțineți informații private Contul de utilizator în * Proprietăți de calitate ale utilizatorului * @param String $ Caracteristică de proprietate cheie care primește accesul * @return Mixt * / Funcție publică __Get (tasta $) (dacă ($ this-\u003e ор -\u003e tasta $)) (revenire $ this-\u003e key orm -\u003e $; ) Returnați null; ))

Jetoanele sunt generate folosind algoritmul SHA1 și sunt stocate în baza de date. Folosesc funcțiile de timp MySQL, pentru a stabili o restricție de 10 minute a relevanței TOKENY.

Când tokenul trece procedura de validare, vorbim direct cu manipulatorul pe care îl considerăm doar jetoanele care nu au date de expirare, stocate în coloana TKEN_VALIDid.

Rețineți că folosesc metoda magică __obține. Bibliotecile Docs la sfârșitul fișierului pentru a intercepta accesul la proprietățile obiectului utilizator.

Datorită acestui fapt, devine posibilă accesarea informațiilor stocate în baza de date, datorită proprietăților $ User-\u003e email, $ user-\u003e token și colab. În următorul fragment de cod, ia în considerare pentru un exemplu, cum să utilizați aceste clase.


Pagina protejată

Un alt fișier care stochează funcționalitatea utilă și necesară este un fișier. funcții.php.. Există mai mulți așa-numitele funcții asistente - asistent care vă permit să creați un cod mai curat și lizibil în alte fișiere.

funcții.php.

Funcție Send_email ($ de la, $ la, $ subiect, Mesaj $) (// helper, trimiterea e-mail $ headers \u003d "Mime-version: 1.0" \\ r \\ n "; $ antets \u003d" Content Tip: Text / Simplu; CHARSET \u003d UTF-8 ". \\ R \\ n"; € antets. \u003d "De la:" $ de la. "\\ R \\ n"; retur e-mail ($ la, $ subiect, $ mesaj, $ antete );) FUNCȚIA GET_PAGE_URL () (// determină adresa URL a fișierului PHP din SUA \u003d "http". (Goală ($ _ server ["https"]? "": "S"). ": //" $ _ server ["Server_name"]; dacă (ISSET (serverul $ _ ["solicitare_uri"]) && $ _Server ["solicitare_uri"]! \u003d "") ($ URL. \u003d $ _Server ["solicitare_uri"];) altceva ($ URL . \u003d $ _SERVER ["PATH_INFO"];) RETURN $ URL;) Funcție Rate_limit ($ IP, $ Limit_Hour \u003d 20, $ Limit_10_min \u003d 10) (// Numărul de încercări de intrare pentru ultima oră pe această adresă IP $ Count_Hour \u003d Orm:: For_Table ("Reg_login_Attempt") -\u003e Unde ("IP", Sprintf ("% U", IP2Long ($ IP))) -\u003e Unde_Rew ("TS\u003e SubTime (acum ()," 1:00 " ) ") -\u003e Numărul (); // Numărul de încercări de intrare în ultimele 10 minute pe această adresă IP $ Count_10_min \u003d Orm :: for_table (" reg_login_Attempt ") -\u003e Unde (" IP ", Sprint f ("% u", ip2long ($ IP))) -\u003e unde_rw ("Ts\u003e Subtime (acum ()," 0:10 ")") -\u003e Count (); Dacă ($ numără_hour\u003e $ limit_hour || $ Count_10_min\u003e $ limit_10_min) (arunca o excepție nouă ("prea multe încercări de conectare!");)))))) funcția rata_limit_tick ($ IP, $ email) (// creați o nouă intrare în tabel Acest lucru ia în considerare numărul de încercări de intrare $ Login_Attempt \u003d Orm :: for_table ("reg_login_Attempt") -\u003e Creare (); $ login_Attempt-\u003e email \u003d $ email; $ login_Attempt-\u003e IP \u003d sprintf ("% U", IP2Long ($ IP )); $ login_Attempt-\u003e Salvare ();) Redirecționarea funcției ($ URL) (antet ("Locație: $ url"); Ieșire;)

Funcții rata_limit. și ritm_limit_tick. Acestea sunt urmate de numărul de încercări de autorizare pentru perioada expirată de timp din momentul primei încercări. Încercarea de intrare este înregistrată în baza de date în coloana Reg_login_Attempt. Aceste funcții sunt numite la procesarea și trimiterea datelor formularului după cum puteți vedea de la fragmentul de cod următor.

Codul este preluat din fișierul de mai jos. index.php. Și procesează trimiterea formularului. Returnează un răspuns JSON, care, la rândul său, este procesat de jQuery în dosar active / JS / SCRIPT.JSpe care le-am dezasamblat deja mai devreme.

index.php.

Încercați (dacă (! Gol ($ _ Post) && izset ($ _ server [http_x_requsted_with "])) (// ieșire un antet antet JSON (" conținut-tip: aplicație / json "); // este această adresă de e-mail Valid dacă (_ ISET ($ _ Post ["Email"]) ||! Filter_var ($ _ Postați ["Email"], Filter_valided_email)) (aruncați o excepție nouă ("Introduceți un e-mail valid");) // Verificați . Indiferent dacă utilizatorul este permis să se conecteze, depășește numărul de conexiuni admise? (Funcții Funcții.php pentru mai multe informații) RATE_LIMIT ($ _ Server ["Remote_Addr"]); // Înregistrați această încercare de a autoriza rata_limit_tick ($ _ Server ["Remote_Addr"], $ _post ["e-mail"]); // trimite o scrisoare către utilizator $ message \u003d ""; $ email \u003d $ _post ["email"]; $ subiect \u003d "link-ul dvs. de conectare" ; dacă (! Utilizator :: există ($ email)) ($ subiect \u003d "vă mulțumesc pentru înregistrare!" $ message \u003d "vă mulțumesc pentru înregistrarea la site-ul nostru! \\ n \\ n";) // Încercați să autorizați sau Înregistrați utilizatorul $ Utilizator \u003d utilizator :: LoginorRregister ($ _ Post ["Email"]); $ mesaj. \u003d "Vă puteți conecta din această adresă URL: \\ n" ; $ mesaj. \u003d get_page_url (). "? tkn \u003d". $ user-\u003e genatetoken () "\\ n \\ n"; $ Mesaj. \u003d "Linkul va expira automat după 10 minute."; $ rezultand \u003d Send_email ($ de la email, $ _post ["Email"], $ subiect, $ mesaj); Dacă (! $ Rezultat) (a aruncat o nouă excepție ("A apărut o eroare la trimiterea de e-mail. Încercați din nou.");) Die (JSON_ENCODE (ARRAY ("Mesaj" \u003d\u003e "Mulțumesc! Am trimis un link În căsuța de e-mail. Verificați și folderul de spam. ")));)))))

După o autorizație de succes / cod de înregistrare, utilizatorul va trimite un link către autorizația utilizatorului. Tocken devine accesibil, pentru că Acesta este transmis ca o variabilă în metoda de legătură generată $ _Get. Cu marker TKN.

index.php.

Dacă (_ _ obține ["tkn"])) (// este acest jetken valabil pentru autorizare? $ User \u003d utilizator :: FindbyToken ($ _ obține ["tkn"]); dacă ($ utilizator) (/// Da este. Pentru a face o redirecționare a paginii protejate de $ user-\u003e Login (), redirecționare ("protejat.php");) // Nu, tokenul nu este valid. Implementați o redirecționare, pe pagină cu formularul de autorizare / înregistrare a redirecționării ("index.php");)

$ Utilizator-\u003e Login ()

creați variabilele necesare pentru sesiune, astfel încât utilizatorul, privindu-se prin paginile ulterioare ale site-ului, va rămâne autorizat tot timpul.

În mod similar, prelucrarea funcției de ieșire a sistemului este, de asemenea, aranjată.

index.php.

Dacă ($ _ obține ["logout"])) ($ Utilizator \u003d utilizator nou (); dacă ($ user-\u003e loggedin ()) ($ user-\u003e logout ();) redirecționare ("index.php" );););

La sfârșitul codului, am pus din nou o redirecționare pe index.php, astfel parametrul ? Logout \u003d 1 Nu este necesar de către adresa URL nu este necesară.

Fișierul nostru. index.php. necesită adăugare. Protecție - Nu vrem ca oamenii care au fost vreodată conectați la sistem au văzut din nou formularul de înregistrare. În aceste scopuri, folosim metoda $ User-\u003e loggedin ().

index.php.

$ Utilizator \u003d utilizator nou (); dacă ($ user-\u003e loggedin ()) (Redirect (protejat.php ");)

În cele din urmă, aici este o bucată de cod care vă permite să protejați paginile site-ului dvs. și să îl puneți la dispoziție numai după autorizare.

protejat.php.

// Pentru a proteja fiecare pagină de pe site-ul dvs., conectați fișierul // Main.php la acesta și creați un nou obiect utilizator. Așa este cât de ușor este! Necesită_once "include / main.php"; $ Utilizator \u003d utilizator nou (); Dacă (! $ Utilizator-\u003e Loggedin ()) (Redirect ("index.php");)

După această verificare, puteți fi siguri că utilizatorul a fost autorizat cu succes. De asemenea, puteți accesa informațiile stocate în baza de date utilizând proprietățile obiectului. $ Utilizator.. Pentru a afișa e-mailurile și utilizatorul și starea acestuia, utilizați acest cod:

ECHO "Emailul dvs.:" $ Utilizator-\u003e Email; ECHO "Rangul dvs .:" $ user-\u003e rang ();

Metodă rang () Folosit aici deoarece baza de date este de obicei stocată (0 pentru un utilizator obișnuit, 1 pentru administrator) și trebuie să convertim aceste date la statusurile la care se referă la noi și această metodă ajută.

Pentru a face un administrator de la un utilizator obișnuit, editați pur și simplu intrarea utilizatorului prin PHPMYADMIN (sau orice alt program care vă permite să gestionați bazele de date). Starea administratorului nu oferă niciun privilegii, în acest exemplu pe pagina va fi afișată că sunteți administrator - și asta este.

Dar ce să faceți cu el - rămâne la discreția dvs., puteți scrie și crea un cod care definește anumite privilegii și oportunități pentru administratori.

Am terminat!

Cu această formă incredibil de super-cvasi simplă, am terminat! Puteți să o utilizați în site-urile PHP, este destul de ușor. De asemenea, îl puteți modifica în sine și îl puteți face așa cum doriți.

Material preparat Denis Baby special pentru site-ul site-ului

P.S. Doriți să treceți în Mastering PHP și OOP? Acordați atenție lecțiilor premium asupra diferitelor aspecte ale clădirilor site-ului, inclusiv programarea PHP, precum și un curs gratuit pentru crearea sistemului CMS pe PHP de la zero utilizând OOP:

Ți-a plăcut materialul și vrei să-i mulțumesc?
Doar împărtășiți cu prietenii și colegii!


1. Să începem cu crearea semnării utilizatorilor în baza de date. Acesta va conține date de utilizator (login și parolă). Să mergem la PhpMyAdmin (dacă creați o bază de date pe PC http: // localhost / phpmyadmin /). Creați un tabel utilizatori.Va avea 3 domenii.

Îl creez în baza de date MySQL, puteți crea într-o altă bază de date. Apoi, setați valorile ca în imagine:

Faceți clic pe " Salvați"Deci, avem o masă.
2. Este necesar să se conecteze la acest tabel. Să creăm un fișier bd.php.. Conținutul său:

În cazul meu arată astfel:

Salvați bd.php.
Excelent! Avem o masă în baza de date, conexiunea la ea. Acum puteți începe să creați o pagină pe care utilizatorii își vor părăsi datele.
3. Creați un fișier reg.php. Cu conținut (toate comentariile din interior):
verifica

verifica




4. Creați un fișier care va permite datele în baza de date și va salva utilizatorul. SAVE_USER.PHP.(Comentariile din interior):

5. Acum, utilizatorii noștri se pot înregistra! Apoi, trebuie să faceți "ușa" pentru a intra în site-ul deja înregistrat utilizatorii. index.php. (Comentariile din interior):
Pagina principală

Pagina principală


Inregistreaza-te


";) Altceva (// dacă nu gol, atunci afișăm legătura ecoului" ați introdus site-ul, cum ar fi. "$ _ Sesiune [" Login "]."
Această legătură este disponibilă numai utilizatorilor înregistrați ";)?\u003e


În dosar index.php. Vom retrage o referință care va fi deschisă numai pentru utilizatorii înregistrați. Aceasta este întreaga esență a scenariului - pentru a limita accesul la orice date.
6. A rămas un fișier cu verificarea conectării și a parolei introduse. Testreg.php. (Comentariile din interior):

Asta este! Poate o lecție și plictisitoare, dar foarte utile. Numai ideea de înregistrare este afișată aici, apoi vă puteți îmbunătăți: Adăugați protecție, design, câmpuri cu date, încărcarea avatarelor, ieșirea din cont (pentru aceasta, distrugeți doar variabilele din sesiune cu o funcție cu o funcție dezactivați.) etc. Noroc!

Am verificat totul, funcționează bine!

Bună ziua, prieteni în acest tutorial vom învăța înregistrarea utilizatorilor și conectarea utilizând procedura stocată PHP.
Structura fișierului pentru acest tutorial
Config.php.
index.php.
check_availabilitate.php.
login.php.
Bun venit.php.
logout.php.
Structura tabelului SQL TBLregistration

Creați tabelul "TBLregistration" (INT (11) nu NULL, "Fullname` Varchar (200) nu NULL,` E-mailId` Varchar (200) Nu NULL, `Parola" Varchar (255) Nu NULL, `Regdate` Timestamp, nu NULL Implicit Current_Timestamp) Motor \u003d InnoDB Charset implicit \u003d latin1;

config.php.

Creați fișier de configurare DB utilizând extensia mysqli. Furnizați acreditarea conform configurației dvs.

index.php.

Creați un formular HTML pentru înregistrarea Uper.

Inregistreaza-te

DEJA ÎNREGISTRAT. Autentifică-te aici.

JQuery / Ajax pentru disponibilitatea prin e-mail a utilizatorului

check_availabilitate.php.

În această pagină vom verifica disponibilitatea e-mailului utilizatorului. Creați o procedură de magazin cu numele Verificați disponibilitatea
Codul de procedură al magazinului:

Delimiter $ creați definere \u003d `rădăcină" `` localhost` procedura "cemadavailbity` (în` Email` Varchar (255)) Nu SQL Selectați e-mail de la TBLregistrare în cazul în care e-mailId \u003d e-mail delimiter $;

Acum creați o procedură de stocare pentru înregistrarea utilizatorului.
Procedura de stocare pentru înregistrarea utilizatorului

DELIMITER $ CREATE DEFINER \u003d `rădăcina" `` localhost` registry` (în "Fname` Varchar (200), în" E-mail "Varchar (200), în" Parola "Varchar (255)) Nu se introduce SQL în TBLregistration ( FullName, Emailid, Parolă) Valori (FNAME, EARIDID, PASSWORD) $ DELIMITER;

După crearea procedurii de stocare, executați procedura de magazin.

";) Altceva (ecou""; } } ?>

Iată codul complet pe care l-am scris pentru înregistrare ( index.php.):

alert("Registration Successfull");";) Altceva (ecou""; } } ?> Înregistrare Utilizarea procedurii de stocare

Inregistreaza-te

DEJA ÎNREGISTRAT. Autentifică-te aici.



conectați-vă .php.

Creați un cont de autentificare Conectare utilizator.

Acum creați o procedură de magazin pentru autentificare cu numele de conectare.
Procedura de conectare:

DELIMITER $ CREATE DEFINER \u003d `Root` @ localhost` procedura" Login` (în `useremail` varchar (255), in` parola Varchar (255)) Nu SQL Selectați e-mail, parola de la TBLregistrare în cazul în care e-mailId \u003d USeremail și parolă \u003d Parolă $ Delimitator;

Acum executați procedura magazinului de conectare

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

Iată codul complet pe care l-am scris pentru autentificare ( login.php.):

0) ($ _sesion ["login"] \u003d $ _ Postare ["useremail"]; antet ("locație: bun venit.php");) altceva ($ _session ["login"] \u003d $ _ Postare ["USEREMAIL"] ECHO ""$ extra \u003d" login.php ";))?\u003e SASA Procedura de conectare la magazin.



bun venit.php.

După ce utilizatorul de conectare va redirecționa la bun venit.php. Va valida această pagină cu sesiunea dacă un utilizator încearcă să acceseze această pagină (Bine ati venit.php), apoi utilizatorul va redirecționa la Login.php Page.

Pagina de întâmpinare.

Bine ati venit:

Logout.


logout.php.

Pentru distrugerea sesiunii de conectare. SESSION_Destroy va distruge toate sesiunile active.

Procesul de creare a unui sistem de înregistrare este destul de mare de lucru. Trebuie să scrieți un cod pe care aș fi repetat validitatea adreselor de e-mail, trimise scrisori de e-mail cu confirmare, au oferit posibilitatea de a restabili parola, ar fi stocat parole într-un loc sigur, verificați formularele de intrare și multe altele. Chiar și atunci când toți faceți acest lucru, utilizatorii se vor înregistra cu reticență, deoarece chiar și cea mai minimă înregistrare necesită activitatea lor.

În ghidul de astăzi, vom dezvolta un sistem simplu de înregistrare, cu care nu veți avea nevoie de parole! Vom obține rezultatele, sistemul care poate fi ușor modificat sau încorporat într-un site PHP existent. Dacă sunteți interesat, continuați să citiți.

PHP.

Acum suntem gata să facem codul PHP. Funcția principală a sistemului de înregistrare este furnizată de clasa de utilizator, pe care o puteți vedea mai jos. Clasa utilizează (), care este o bibliotecă minimalistă pentru a lucra cu baze de date. Clasa utilizatorului este responsabilă pentru accesarea bazelor de date, generând Token-S pentru autentificare și validarea acestora. Acesta reprezintă o interfață simplă care poate fi inclusă cu ușurință în sistemul de înregistrare pe site-urile dvs. bazate pe PHP.

User.class.php.

// instanță privată orică
Private $ ORM;

/**
* Găsiți un utilizator de un șir de jetoane. Numai jetoanele valide sunt luate în considerare
* Considerare. Un jeton este valabil timp de 10 minute după ce a fost generat.
* @param string $ token token pentru a căuta
* @ utilizator utilizator.
*/

Funcția statică publică FindByToken ($ token) (

// găsiți-l în baza de date și asigurați-vă că marcajul este corect


-\u003e Unde ("Token", $ token)
-\u003e unde_raw ("token_validy\u003e acum ()")
-\u003e gind_one ();

Dacă (Rezultatul $) (
Întoarce-te fals;
}

Returnați utilizatorul nou (rezultatul $);
}

/**
* Fie conectați sau înregistrați un utilizator.
* @ utilizator utilizator.
*/

Funcția publică Static LoginorRregister ($ e-mail) (

// Dacă un astfel de utilizator există deja, returnați-l

Dacă (utilizatorul :: există ($ email)) (
Returnați utilizatorul nou ($ email);
}

// altfel, creați-l și returnați-l

Return Utilizator :: Creați ($ email);
}

/**
* Creați un utilizator nou și salvați-l în baza de date
* @Param string $ e-mail adresa de e-mail a utilizatorului
* @ utilizator utilizator.
*/

Funcția statică privată Creați ($ email) (

// Scrieți un utilizator nou în baza de date și returnați-l

$ Rezultat \u003d Orm :: for_table ("reg_Users") -\u003e Creare ();
$ rezultat-\u003e Email \u003d $ email;
$ Rezultat-\u003e salvați ();

Returnați utilizatorul nou (rezultatul $);
}

/**
* Verificați dacă un astfel de utilizator există în baza de date și returnați o booleană.
* @Param string $ e-mail adresa de e-mail a utilizatorului
* @return boolean
*/

Funcția statică publică există ($ e-mail) (

// Există utilizatorul în baza de date?
$ rezultat \u003d Orm :: for_table ("reg_Users")
-\u003e Unde ("Email", $ email)
-\u003e numărul ();

Returnați rezultatul $ \u003d\u003d 1;
}

/**
* Creați un obiect nou utilizator
* @param $ Param Orm instanta, ID, e-mail sau null
* @ utilizator utilizator.
*/

Funcția publică __construct ($ param \u003d null) (

Dacă ($ param instanceof om) (

// a fost adoptată o instanță ORM
$ acest-\u003e orrm \u003d $ param;
}
Altfel dacă (Is_String ($ param)) (

// a fost trecut un e-mail
$ this-\u003e
-\u003e Unde ("Email", $ PARAM)
-\u003e gind_one ();
}
Altfel (

Dacă (is_numeric ($ param)) (
// un ID de utilizator a fost trecut ca parametru
$ id \u003d $ param;
}
Altfel dacă (Isset (sesiune de $ _ ["LOGINID"])) (

// Nici un ID de utilizator nu a fost trecut, examinați în sesiune
$ id \u003d $ _session ["loginid"];
}

$ acest-\u003e orrm \u003d orrm :: for_table ("reg_Users")
-\u003e Unde ("ID", $ ID)
-\u003e gind_one ();
}

/**
* Generează un nou token de conectare SHA1, îl scrie în baza de date și îl întoarce.
* @ string @return.
*/

Funcția publică GeneraTETOKEN () ()
// Generați un jeton pentru utilizatorul înregistrat. Salvați-o în baza de date.

$ token \u003d SHA1 ($ acest-\u003e email.Time (). Rand (0, 1000000));

// salvați jetonul în baza de date
// și marchează ca fiind valabil numai pentru următoarele 10 minute

$ acest-\u003e om-\u003e set ("token", $ token);
$ acest-\u003e orrm-\u003e set_expr ("token_validy", "addtime (acum ()," 0:10 ")");
$ this-\u003e om-\u003e salvați ();

Returnați $ token;
}

/**
* Conectați-l pe acest utilizator
* @return Void.
*/

Funcția publică Login () ()

// marcați utilizatorul ca logat
$ _Session ["Loginid"] \u003d $ Acest-\u003e id-\u003e id;

// actualizați câmpul Last_Login DB
$ acest-\u003e orrm-\u003e set_expr ("ultimul_login", "acum ()");
$ this-\u003e om-\u003e salvați ();
}

/**
* Distruge sesiunea și deconectați utilizatorul.
* @return Void.
*/

Funcția publică Logout () ()
$ _Session \u003d matrice ();
Debut (sesiune de $ _);
}

/**
* Verificați dacă utilizatorul este logat.
* @return boolean
*/

Funcția publică loggedin () ()
Return isset ($ acest-\u003e id-\u003e id) && $ _session ["loginid"] \u003d\u003d $ Acest-\u003e id-\u003e id;
}

/**
* Verificați dacă utilizatorul este un administrator
* @return boolean
*/

Funcția publică Isadmin () (
Returnați $ acest-\u003e rang () \u003d\u003d "administrator";
}

/**
* Găsiți tipul de utilizator. Poate fi admin sau regulat.
* @ string @return.
*/

Clasamentul funcției publice () (
dacă ($ acest-\u003e om-\u003e rang \u003d\u003d 1) (
Returnați "Administrator";
}

Returnați "regulat";
}

/**
* Metoda magică pentru accesarea elementelor private
* Instanță de $ ORM ca proprietăți ale obiectului utilizatorului
* @Param string $ key numele proprietății accesate "
* @return Mix
*/

Funcția publică __get (tasta $) (
Dacă (Isset ($ this-\u003e orm -\u003e key $)) (
Returnați $ acest-\u003e Om -\u003e $ cheie;
}

Întoarceți null;
}
}
Token-S sunt generate de algoritm și sunt stocate în baza de date. Utilizăm de la MySQL pentru a seta valoarea în coloana Ten_valid, egală cu 10 minute. Când validarea TKEN, informăm motorul pe care avem nevoie de token, câmpul Token_Vality nu a expirat încă. Așa că limităm timpul în care Tenkenul va fi valabil.

Rețineți că folosim metoda Magic __get () la sfârșitul documentului pentru a accesa proprietățile obiectului utilizator. Acest lucru ne permite să accesăm datele stocate în baza de date sub formă de proprietăți: $ user-\u003e email, $ user-\u003e token. De exemplu, să vedem cum putem folosi această clasă în următorul fragment de cod:


Un alt fișier în care este stocată funcționalitatea necesară este funcțiile.php. Acolo avem mai multe funcții auxiliare care ne permit să păstrăm mai mult codul rămas.

Funcții.php.

Funcția Send_Email ($ de la, $ la, $ subiect, $ mesaj) (

// funcția helper pentru trimiterea e-mailului

$ Headers \u003d "Mime-version: 1.0". "\\ r \\ n";
$ Anteturi. \u003d "Tipul de conținut: text / simplu; CHARSET \u003d UTF-8". "\\ r \\ n";
$ Anteturi. \u003d "De la:". $ De la. "\\ r \\ n";

Returnați corespondența ($ la, $ subiect, $ mesaj, $ antete);
}

funcție get_page_url () ()

// Aflați adresa URL a unui fișier PHP

$ url \u003d "http". (goală ($ _ server ["https"])? "": "S"). ": //" $ _ server ["server_name";

Dacă (Isset ($ _ server ["solicitare_uri"]) && $ _Server ["solicitare_uri"]! \u003d "") (
$ Url. \u003d $ _Server ["solicitare_uri"];
}
Altfel (
$ URL. \u003d $ _SERVER ["PATH_INFO"];
}

Returnați adresa URL;
}

funcție Rate_limit ($ IP, $ Limit_Hour \u003d 20, $ limit_10_min \u003d 10) (

// Numărul de încercări de autentificare pentru ultima oră de această adresă IP

$ Numar_hour \u003d orrm :: for_table ("reg_login_Attempt")
->
-\u003e Unde_Rew ("TS\u003e SubTime (acum ()," 1:00 ")")
-\u003e numărul ();

// Numărul de încercări de autentificare în ultimele 10 minute de această adresă IP

$ Numar_10_min \u003d Orm :: for_table ("reg_login_Attempt")
-\u003e Unde ("IP", Sprintf ("% U", IP2Long ($ IP)))
-\u003e unde_raw ("Ts\u003e Subtime (acum ()," 0:10 ")")
-\u003e numărul ();

Dacă ($ numără_hour\u003e $ limit_hour || $ Count_10_min\u003e $ limit_10_min) (
Aruncați o nouă excepție ("prea multe încercări de conectare!");
}
}

funcția rata_limit_tick ($ ip, $ email) (

// Creați o înregistrare nouă în tabelul de încercare de conectare

$ login_attempt \u003d orrm :: for_table ("reg_login_Attempt") -\u003e Creare ();

$ login_Attempt-\u003e Email \u003d $ email;
$ login_attempt-\u003e ip \u003d sprintf ("% u", ip2long ($ ip));

$ login_Attempt-\u003e Salvare ();
}

funcția redirecționată (adresa URL de $) (
Antet ("locație: $ url");
Ieșire;
}
Funcțiile rata_limit și ratat_limit_tick ne permit să limităm numărul de încercări de autorizare pentru o anumită perioadă de timp. Încercările autorizației sunt înregistrate în baza de date REG_LOGIN_ATTEMPT. Aceste funcții sunt pornite la confirmarea formularului de autorizare, așa cum se poate observa în următorul fragment de cod.

Codul de mai jos a fost preluat de la index.php și este responsabil pentru confirmarea formei de autorizare. Acesta returnează un răspuns JSON care este controlat de codul JQuery, pe care l-am văzut în active / js / script.js.

index.php.

Dacă (! Gol ($ _ Post) && izset ($ _ server [http_x_requtent_with "])) (

// ieșirea unui antet JSON

Antetul ("tipul de conținut: aplicație / json");

// Este valabil adresa de e-mail?

Dacă (! _ _ Post ["email"]) ||! Filter_var ($ _ Postare ["Email"], filtru_validate_email)) (
Aruncați o nouă excepție ("Introduceți un e-mail valid");
}

// Aceasta va arunca o excepție dacă persoana este mai mare
// limitele permise de autentificare (a se vedea funcțiile.php pentru mai mult):
ritm_limit ($ _ server ["la distanță_addr"];

// Înregistrați această încercare de conectare
ratat_limit_tick ($ _ server ["la distanță_addr"], $ _post ["e-mail"]);

// trimite mesajul către utilizator

$ message \u003d "";
$ email \u003d $ _post ["email"];
$ subiect \u003d "link-ul dvs. de conectare";

Dacă (! Utilizator :: există ($ email)) (
$ subiect \u003d "vă mulțumesc pentru înregistrare!";
$ Message \u003d "Vă mulțumim că ați înregistrat pe site-ul nostru! \\ N \\ n";
}

// încercați să vă conectați sau să înregistrați persoana
$ Utilizator \u003d Utilizator :: Loginorregister ($ _ Post ["Email"]);

$ Mesaj. \u003d "Puteți să vă conectați din această adresă URL: \\ n";
$ mesaj. \u003d get_page_url (). "? tkn \u003d". $ user-\u003e genatetoken () "\\ n \\ n";

$ Mesaj. \u003d "Linkul va expira automat după 10 minute.";

$ rezultand \u003d Send_email ($ de la email, $ _post ["Email"], $ subiect, $ mesaj);

Dacă (Rezultatul $) (
Aruncați o nouă excepție ("A apărut o eroare la trimiterea e-mailului dvs. Încercați din nou.");
}

Die (JSON_ENCODE (matrice (
"Mesaj" \u003d\u003e "Mulțumesc! Am trimis un link în căsuța de e-mail. Verificați și dosarul spam. "
)));
}
}
prinde (excepție $ e) (

Die (JSON_ENCODE (matrice (
"Eroare" \u003d\u003e 1,
"Mesaj" \u003d\u003e $ e-\u003e getMessage ()
)));
}
În cazul unei autorizații sau înregistrarea reușite, codul de mai sus se referă la e-mail unei persoane cu un link pentru autorizare. Token (Lexeme) devine disponibil ca $ _get-variabil "TKN" în vizualizarea adresei URL generate.

index.php.

Dacă (Isset ($ _ obține ["tkn"]) (

// Este un jeton de conectare valid?
$ User \u003d utilizator :: FindByToken ($ _ obține ["tkn"];

// Da! Conectați utilizatorul și redirecționați la pagina protejată.

$ User-\u003e Login ();
Redirecționați ("protejat.php");
}

// Simbol Invalid. Redirecționați înapoi la forma de autentificare.
Redirecționați ("index.php");
}
Running $ Utilizator-\u003e Login () va crea variabilele necesare pentru sesiune, care va permite utilizatorului să rămână autorizat la intrările ulterioare.

Ieșirea din sistem este realizată în aproximativ același mod:

Index.php.

Dacă (Isset ($ _ obține ["logout"])) (

$ Utilizator \u003d utilizator nou ();

Dacă ($ user-\u003e loggedin ()) (
$ User-\u003e logout ();
}

Redirecționați ("index.php");
}
La sfârșitul codului, redirecționăm din nou utilizatorul pe index.php, deci parametrul? Logout \u003d 1 din adresa URL este exclusă.

Fișierul nostru index.php va avea nevoie, de asemenea, de protecție - nu vrem ca utilizatorii autorizați să fi văzut formularul. Pentru a face acest lucru, folosim metoda $ user-\u003e logged ():

Index.php.

$ Utilizator \u003d utilizator nou ();

dacă ($ user-\u003e loggedin ()) (
Redirecționați ("protejat.php");
}
În cele din urmă, să vedem cum puteți proteja pagina site-ului dvs. și puneți-o disponibilă numai după autorizare:

protejat.php.

// Pentru a proteja orice pagină PHP de pe site-ul dvs., includeți Main.php
// și creați un obiect nou utilizator. Este atat de simplu!

necesită_once "include / main.php";

$ Utilizator \u003d utilizator nou ();

dacă (! $ user-\u003e loggedin ()) (
Redirecționați ("index.php");
}
După această verificare, puteți fi siguri că utilizatorul a fost autorizat cu succes. De asemenea, veți avea acces la date stocate în baza de date ca proprietăți ale obiectului USER $. Pentru a afișa utilizatorul de e-mail și rangul acestora, utilizați următorul cod:

ECHO "Emailul dvs.:" $ Utilizator-\u003e Email;
eCHO "Rangul dvs .:" $ user-\u003e rang ();
Aici este o metodă, deoarece coloana de rang din baza de date conține, de obicei, numere (0 pentru utilizatorii obișnuiți și 1 pentru administratori) și trebuie să-l convertim pe toate în numele rangurilor, care este implementat utilizând această metodă. Pentru a converti un utilizator obișnuit la administrator, editați pur și simplu înregistrarea utilizatorului în PhpMyAdmin (sau în orice alt program de baze de date de date). Fiind un administrator, utilizatorul nu va fi înzestrat cu câteva caracteristici speciale. Voi în dreptul de a alege ce drepturi să înzestreze administratorii.

Gata!

În acest sens, sistemul nostru de înregistrare fără pretențios este gata! Puteți să o utilizați pe site-ul PHP deja existent sau să îl actualizați, aderarea la propriile cerințe.