Crearea unui sistem simplu de înregistrare a utilizatorilor pe PHP și MySQL. Crearea unui sistem simplu de înregistrare a utilizatorilor pe PHP și MySQL Impersonal Index PHP Înregistrare
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;
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
Î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 /
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 orrm-\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 ratat_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 spamului. ")));))))) De captură (JSON_ENCODE (matrice (eroare" \u003d\u003e 1, "Mesaj" \u003d\u003e $ e-\u003e getMessage ())));)
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:
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!
Buna! Acum vom încerca să implementăm cea mai simplă înregistrare pe site folosind PHP + MySQL. Pentru aceasta, Apache trebuie instalat pe computer. Principiul funcționării scenariului nostru este prezentat mai jos.
1. Să începem cu crearea rețelelor de utilizatori din baza de date. Acesta va conține date de utilizator (login și parolă). Du-te la PhpMyAdmin (dacă creați o bază 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:
2. Este necesar să se conecteze la acest tabel. Să creăm un fișier bd.php.. Conținutul său:
$ db \u003d mysql_connect ("Serverul MySQL", "Conectați-vă la acest server", "Parolă la acest server"); mysql_select_db ("numele bazei la care vă conectați", $ db); ?>
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):