Scriem înregistrarea în php. Crearea unui sistem simplu de înregistrare a utilizatorilor în PHP și MySQL

Crearea unui site bazat pe abonament pare o sarcină descurajantă la început. Dacă ați vrut vreodată să faceți acest lucru singur, apoi ați renunțat când ați început să vă gândiți cum o veți pune împreună folosind abilitățile dvs. PHP, atunci acest articol este pentru dvs. Vă vom prezenta fiecare aspect al creării unui site bazat pe abonament, cu o zonă de membri securizată protejată prin parolă.

Întregul proces constă din două părți mari: înregistrarea utilizatorului și autentificarea utilizatorului. În prima parte, vom acoperi crearea formularului de înregistrare și stocarea datelor într-o bază de date MySQL. În a doua parte, vom crea formularul de autentificare și îl vom folosi pentru a permite accesul utilizatorilor în zona securizată.

Descărcați codul

Puteți descărca întregul cod sursă pentru sistemul de înregistrare/login din linkul de mai jos:

Configurare și încărcare
Fișierul ReadMe conține instrucțiuni detaliate.

Deschide sursă\include\membersite_config.php fișier într-un editor de text și actualizați configurația. (Autentificare la baza de date, numele site-ului dvs., adresa dvs. de e-mail etc).

Încărcați întregul conținut al directorului. Testați register.php prin trimiterea formularului.

Formularul de înregistrare

Pentru a crea un cont de utilizator, trebuie să colectăm o cantitate minimă de informații de la utilizator. Avem nevoie de numele lui, adresa de e-mail și numele de utilizator dorit si parola. Desigur, putem cere mai multe informații în acest moment, dar o formă lungă este întotdeauna o oprire. Deci, să ne limităm doar la acele domenii.

Iată formularul de înregistrare:

Înregistrați-vă numele complet*: Adresă de e-mail*: Nume utilizator*: Parolă*:

Deci, avem câmpuri de text pentru nume, e-mail și parolă. Rețineți că folosim pentru o mai bună utilizare.

Validarea formularului

În acest moment, este o idee bună să punem un cod de validare a formularului, așa că ne asigurăm că avem toate datele necesare pentru a crea contul de utilizator. Trebuie să verificăm dacă numele și e-mailul și parola sunt completate și dacă e-mailul este în formatul adecvat.

Gestionarea depunerii formularului

Acum trebuie să ne ocupăm de datele din formular care sunt trimise.

Iată secvența (vezi fișierul fg_membersite.php în sursa descărcată):

funcția RegisterUser() ( if(!isset($_POST["trimis"])) ( returnează fals; ) $formvars = array(); if(!$this->ValidateRegistrationSubmission()) ( returnează false; ) $this- >CollectRegistrationSubmission($formvars); if(!$this->SaveToDatabase($formvars)) ( returnează false; ) if(!$this->SendUserConfirmationEmail($formvars)) ( returnează false; ) $this->SendAdminIntimationEmail($ formvars); returnează adevărat; )

În primul rând, validăm trimiterea formularului. Apoi colectăm și „igienizăm” datele de trimitere a formularelor (faceți întotdeauna acest lucru înainte de a trimite e-mailuri, de a salva în baza de date etc). Trimiterea formularului este apoi salvată în tabelul bazei de date. Trimitem un e-mail utilizatorului prin care solicită confirmarea. Apoi informăm administratorul că un utilizator s-a înregistrat.

Salvarea datelor în baza de date

Acum că am adunat toate datele, trebuie să le stocăm în baza de date.
Iată cum salvăm trimiterea formularului în baza de date.

funcția SaveToDatabase(&$formvars) ( if(!$this->DBLogin()) ( $this->HandleError(„Conectarea la baza de date a eșuat!”); return false; ) if(!$this->Ensuretable()) ( return false; ) if(!$this->IsFieldUnique($formvars,"email")) ( $this->HandleError("Acest e-mail este deja înregistrat"); return false; ) if(!$this->IsFieldUnique( $formvars,"username")) ( $this->HandleError("Acest nume de utilizator este deja folosit. Vă rugăm să încercați un alt nume de utilizator"); return false; ) if(!$this->InsertIntoDB($formvars)) ( $this- >HandleError("Inserarea în baza de date a eșuat!"); return false; ) return true; )

Rețineți că ați configurat detaliile de conectare la baza de date în fișierul membersite_config.php. În cele mai multe cazuri, puteți utiliza „localhost” pentru gazda bazei de date.
După autentificare, ne asigurăm că tabelul există. (Dacă nu, scriptul va crea tabelul necesar).
Apoi ne asigurăm că numele de utilizator și e-mailul sunt unice. Dacă nu este unic, returnăm eroarea înapoi utilizatorului.

Structura tabelului bazei de date

Aceasta este structura tabelului. Funcția CreateTable() din fișierul fg_membersite.php creează tabelul. Iată codul:

function CreateTable() ( $qry = "Creați tabelul $this->tablename (". "id_user INT NOT NULL AUTO_INCREMENT ," "name VARCHAR(128) NOT NULL ," "email VARCHAR(64) NOT NULL ," " "phone_number VARCHAR(16) NOT NULL ," "nume utilizator VARCHAR(16) NOT NULL ," "parolă VARCHAR(32) NOT NULL ," "confirmcode VARCHAR(32) ," "PRIMARY KEY (id_user)." ")"; if( !mysql_query($qry,$this->connection)) ( $this->HandleDBError("Eroare la crearea tabelului \nquery a fost\n $qry"); return false; ) return true; )

Câmpul id_user va conține id-ul unic al utilizatorului și este, de asemenea, cheia primară a tabelului. Observați că permitem 32 de caractere pentru câmpul de parolă. Facem acest lucru pentru că, ca măsură suplimentară de securitate, vom stoca parola în baza de date criptată folosind MD5. Vă rugăm să rețineți că, deoarece MD5 este o metodă de criptare unidirecțională, nu vom putea recupera parola în cazul în care utilizatorul o uită.

Inserarea inregistrarii in tabel

Iată codul pe care îl folosim pentru a introduce date în baza de date. Vom avea toate datele noastre disponibile în matricea $formvars.

funcția InsertIntoDB(&$formvars) ( $confirmcode = $this->MakeConfirmationMd5($formvars[„email”]); $insert_query = „inserați în „.$this->tablename.”(nume, e-mail, nume de utilizator, parolă, confirmcode) valori ("" . $this->SanitizeForSQL($formvars["nume"]) . "", "" . $this->SanitizeForSQL($formvars["email"]) . "", "" . $ this->SanitizeForSQL($formvars["nume utilizator"]) . "", "" . md5($formvars["parolă"]) . "", "" . $confirmcode . "")"; if(! mysql_query( $insert_query ,$this->connection)) ( $this->HandleDBError("Eroare la inserarea datelor în tabel\nquery:$insert_query"); return false; ) return true; )

Observați că folosim funcția PHP md5() pentru a cripta parola înainte de a o introduce în baza de date.
De asemenea, facem codul unic de confirmare de la adresa de e-mail a utilizatorului.

Trimiterea de e-mailuri

Acum că avem înregistrarea în baza noastră de date, vom trimite un e-mail de confirmare utilizatorului. Utilizatorul trebuie să facă clic pe un link din e-mailul de confirmare pentru a finaliza procesul de înregistrare.

funcția SendUserConfirmationEmail(&$formvars) ( $mailer = new PHPMailer(); $mailer->CharSet = "utf-8"; $mailer->AddAddress($formvars["email"], $formvars["nume"]) ; $mailer->Subject = "Înregistrarea dvs. cu ".$this->sitename; $mailer->From = $this->GetFromAddress(); $confirmcode = urlencode($this->MakeConfirmationMd5($formvars["email" ])); $confirm_url = $this->GetAbsoluteURLFolder()."/confirmreg.php?code=".$confirmcode; $mailer->Body ="Bună ziua ".$formvars["nume"]."\r\ n\r\n." "Multumesc pentru tineînregistrare cu „.$this->sitename.”\r\n". „Vă rugăm să faceți clic pe linkul de mai jos pentru a vă confirma înregistrarea.\r\n". „$confirm_url\r\n". „\r\n". „Cu respect,\r\n”. „Webmaster\r\n”. $this->sitename; if(!$mailer->Send()) ( $this->HandleError(„Eșuat trimiterea e-mailului de confirmare a înregistrării.”) ; returnează fals; ) returnează adevărat; )

Actualizări

9 ianuarie 2012
Sunt adăugate funcțiile Resetare parolă/Modificare parolă
Codul este acum partajat la GitHub.

Bine ai revenit!

Licență


Codul este partajat sub licență LGPL. Îl puteți folosi liber pe site-uri web comerciale sau necomerciale.

Nu există postări înrudite.

Comentariile la această intrare sunt închise.

Formularele HTML sunt elemente complexe de interfață. Acestea includ diverse elemente funcționale: câmpuri de introducere, liste, sfaturi cu instrumente etc. Tot codul formularului este conținut în .

Majoritatea informațiilor din formularele web sunt transmise folosind . Pentru a introduce o singură linie de text, se folosește elementul; pentru mai multe linii, se folosește elementul. Elementul creează o listă derulantă.

Elementul creează etichete pentru câmpurile de formular. Există două moduri de a grupa etichetele și câmpurile. Dacă câmpul se află în interiorul unui element, atunci nu este necesar să fie specificat atributul for.

Nume Nume Nume

Câmpurile formularului pot fi împărțite în blocuri logice folosind elementul. Fiecare secțiune poate primi un nume folosind elementul.

Informații de contact Nume E-mail
Orez. 1. Gruparea câmpurilor formularului

Pentru a face formularul mai ușor de înțeles pentru utilizatori, textul este adăugat în câmpurile formularului pentru a oferi un exemplu de date de intrare. Acest tip de text se numește text wildcard și este creat folosind atributul substituent.

Câmpurile obligatorii trebuie de asemenea evidențiate. Înainte de HTML5, simbolul asterisc * era folosit lângă numele câmpului. Noua specificație introduce un atribut obligatoriu special, care vă permite să marcați un câmp obligatoriu la nivel de marcare. Acest atribut indică browserului (presupunând că acceptă HTML5) să nu trimită date după ce utilizatorul dă clic pe Trimite până când câmpurile specificate sunt completate.

Pentru a schimba aspectul câmp de text La primirea focalizării, se utilizează pseudoclasa de focalizare. De exemplu, puteți întuneca fundalul câmpului curent sau puteți adăuga rama colorata pentru a-l face să iasă în evidență de restul:

Intrare: focus ( fundal: #eaeaea; )

Un alt atribut HTML5 util este atributul autofocus. Vă permite să setați automat focalizarea pe câmpul inițial dorit pentru elemente și (doar un element din fiecare formular).

Exemplu de creare a unui formular de înregistrare

Marcaj HTML

Înregistrare Nume Sex bărbat femeie E-mail Țară Selectați țara de reședință Rusia Ucraina Belarus Trimiteți

Notă
action="form.php" - link către fișierul de gestionare a formularelor. Creați un fișier în codificare UTF-8, încărcați-l pe server și înlocuiți action="form.php" cu calea către fișierul de pe serverul dvs.


Orez. 2. Aspect forme implicite

După cum puteți vedea din figură, fiecare element de formular are stiluri implicite de browser. Să ștergem stilurile și să stilăm elementele de formular.

Form-wrap ( lățime: 550px; fundal: #ffd500; chenar-rază: 20px; ) .form-wrap *(tranziție: .1s liniar) .profile ( lățime: 240px; float: stânga; text-align: center; umplutură) : 30px; ) form ( fundal: alb; float: stânga; lățime: calc(100% - 240px); padding: 30px; border-radius: 0 20px 20px 0; culoare: #7b7b7b; ) .form-wrap:after, form div:after (conținut: ""; afișare: tabel; clar: ambele; ) form div ( margin-bottom: 15px; poziție: relativ; ) h1 ( font-size: 24px; font-weight: 400; poziție: relativ ; margin-sus: 50px; ) h1:după (conținut: „\f138”; dimensiunea fontului: 40px; familia de fonturi: FontAwesome; poziție: absolut; sus: 50px; stânga: 50%; transformare: translateX(-50) %); ) /************************ stilul elementelor de formular ******************** * **/ etichetă, span ( afișare: bloc; dimensiunea fontului: 14px; marginea inferioară: 8px; ) introducere, introducere ( lățime chenar: 0; contur: niciunul; marjă: 0; lățime: 100%; umplutură: 10px 15px; fundal: #e6e6e6; ) input:focus, input:focus (box-shadow: inset 0 0 0 2px rgba(0,0,0,.2); ) .radio etichetă ( poziție: relativă; padding-left: 50px; cursor: pointer; lățime: 50%; float: stânga; line-height: 40px; ) .radio input (poziție: absolut; opacitate: 0; ) .radio -control (poziție: absolut; sus: 0; stânga: 0; înălțime: 40px; lățime: 40px; fundal: #e6e6e6; chenar-rază: 50%; text-align: center; ) .male:before ( conținut: " \f222"; font-family: FontAwesome; font-weight: bold; ) .female:before (conținut: "\f221"; font-family: FontAwesome; font-weight: bold; ) .radio label:hover input ~ . control radio, .radiol input:focus ~ .radio-control (box-shadow: inset 0 0 0 2px rgba(0,0,0,.2); ) .radio input:verificat ~ .radio-control (culoare: roșu; ) selectați ( lățime: 100%; cursor: indicator; umplutură: 10px 15px; contur: 0; chenar: 0; fundal: #e6e6e6; culoare: #7b7b7b; -webkit-appearance: none; /* debifați webkit -browsere */ -moz-appearance: none; /*debifați în Mozilla Firefox*/ ) select::-ms-expand ( display: none; /*unbifați în IE*/ ) .select-arrow (poziția: absolute); sus: 38px; dreapta: 15px; latime: 0; inaltime: 0; evenimente pointer: niciunul; /*activează afișarea listei când dai clic pe săgeată*/ border-style: solid; lățime chenar: 8px 5px 0 5px; border-color: #7b7b7b transparent transparent transparent; Buton ) ( umplutură: 10px 0; lățime chenar: 0; afișare: bloc; lățime: 120px; marjă: 25px automat 0; fundal: #60e6c5; culoare: alb; dimensiune font: 14px; contur: niciunul; text-transform : majuscule; ) /************************ adaugă adaptabilitate la forma ******************** ** **/ @media (lățime maximă: 600 px) ( .form-wrap (marja: 20 px automat; lățime maximă: 550 px; lățime: 100 %;) .profil, form (float: niciunul; lățime: 100% ;) h1 (margin-top: automat; padding-bottom: 50px;) form (border-radius: 0 0 20px 20px;) )

Fișierul Form.php

Notă
În variabila $subject, specificați textul care va fi afișat ca titlu al scrisorii;
Your_name - aici puteți specifica numele care va fi afișat în câmpul „de la cine este scrisoarea”;
înlocuiți your_site_url cu adresa site-ului cu formularul de înregistrare;
înlocuiți your_email cu adresa dvs E-mail;
$headers .= „Bcc: e-mail-ul tău”. „\r\n”; trimite bcc la adresa ta de e-mail.

Buna ziua! Acum vom încerca să implementăm cea mai simplă înregistrare pe site cu folosind PHP+ MySQL. Pentru a face acest lucru, Apache trebuie să fie instalat pe computer. Principiul de funcționare al scenariului nostru este prezentat mai jos.

1. Să începem prin a crea un tabel de utilizatori în baza de date. Acesta va conține datele utilizatorului (login și parolă). Să mergem la phpmyadmin (dacă creați o bază de date pe computer http://localhost/phpmyadmin/). Creăm un tabel utilizatori, acesta va avea 3 câmpuri.

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

2. Este necesară o conexiune la acest tabel. Să creăm un fișier bd.php. Conținutul său:

In cazul meu arata cam asa:

Salvați bd.php.
Grozav! Avem un tabel în baza de date și o conexiune la acesta. Acum puteți începe să creați o pagină pe care utilizatorii își vor lăsa datele.

3. Creați un fișier reg.php cu conținutul (toate comentariile în interior):



Înregistrare


Înregistrare


Autentificarea dvs.:




Parola Dvs:








4. Creați un fișier care va introduce date în baza de date și va salva utilizatorul. save_user.php (comentarii în interior):

5. Acum utilizatorii noștri se pot înregistra! Apoi, trebuie să creați o „ușă” pentru ca utilizatorii deja înregistrați să intre pe site. index.php (comentarii în interior):




pagina principala


pagina principala


Autentificarea dvs.:


Parola Dvs:






Inregistreaza-te



OK, totul sa terminat acum! Lecția poate fi plictisitoare, dar foarte utilă. Numai ideea de înregistrare este afișată aici, apoi o puteți îmbunătăți: adăugați securitate, design, câmpuri de date, încărcare avatare, deconectare din contul dvs. (pentru a face acest lucru, pur și simplu distruge variabilele din sesiune cu funcția unset) și curând. Noroc!

Am verificat totul, funcționează corect!

Reg.ru: domenii și găzduire

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

Peste 2 milioane de nume de domenii în serviciu.

Promovare, corespondență de domeniu, soluții de afaceri.

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

* Treceți mouse-ul peste pentru a întrerupe derularea.

Inapoi inainte

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

Crearea unui sistem de înregistrare este multă muncă. Trebuie să scrieți un cod care validează adresele de e-mail, trimite un e-mail de confirmare a înregistrării și validează, de asemenea, alte câmpuri de formular și multe altele.

Și chiar și după ce vei scrie toate acestea, utilizatorii vor fi reticenți să se înregistreze, pentru că... acest lucru necesită un efort din partea lor.

În acest tutorial, vom crea un sistem de înregistrare foarte simplu care nu necesită și nu stochează parole deloc! Rezultatul va fi ușor de modificat și adăugat la un site PHP existent. Vrei să afli cum funcționează? Cititi mai jos.



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

Vom combina formularul de autorizare și înregistrarea. Acest formular va avea un câmp pentru introducerea adresei de e-mail și un buton de înregistrare;
- La completarea câmpului cu o adresă de email, făcând clic pe butonul de înregistrare se va crea o înregistrare despre un utilizator nou, dar numai dacă adresa de email introdusă nu a fost găsită în baza de date.

După aceasta, se creează un set unic aleatoriu de caractere (token), care este trimis către e-mailul specificat de utilizator sub forma unui link care va fi relevant timp de 10 minute;
- Link-ul duce utilizatorul la site-ul nostru web. Sistemul determină prezența unui token și autorizează utilizatorul;

Avantajele acestei abordări:

Nu este necesară stocarea parolelor sau validarea câmpurilor;
- Nu este nevoie să vă recuperați parola, Intrebari de securitate etc.;
- Din momentul în care un utilizator se înregistrează/se logează, poți fi întotdeauna sigur că acest utilizator se va afla în zona ta de acces (că adresa de e-mail este adevărată);
- Proces de înregistrare incredibil de simplu;

Defecte:

Securitatea contului de utilizator. Dacă cineva are acces la e-mailul utilizatorului, se poate conecta.
- E-mailul nu este sigur și poate fi interceptat. Rețineți că această întrebare este relevantă și în cazul în care parola a fost uitată și trebuie restaurată, sau în orice sistem de autorizare care nu utilizează HTTPS pentru transferul de date (login/parolă);
- În timp ce vă configurați corect serverul de e-mail, există șansa ca mesajele cu linkuri de autorizare să ajungă în spam;

Comparând avantajele și dezavantajele sistemului nostru, putem spune că sistemul are o utilizare ridicată (confort maxim pentru utilizatorul final) și, în același timp, are un indicator de securitate scăzut.

Așa că este sugerat să îl utilizați 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 un sistem pentru a autoriza utilizatorii pe site-ul dvs. și nu doriți să dezasamblați această lecție până la oase, iată ce trebuie să faceți:

Trebuie să descărcați sursele atașate lecției
- Găsiți fișierul tables.sql în arhivă. Importați-l în baza de date folosind opțiunea de import din phpMyAdmin. Mod alternativ: deschideți acest fișier printr-un editor de text, copiați interogarea SQL și executați-o;
- Deschide includes/main.php și completează setările pentru conectarea la baza ta (specificați utilizatorul și parola pentru conectarea la baza de date, precum și gazda și numele bazei de date). În același fișier, trebuie să specificați și e-mailul, care va fi folosit ca adresă inițială pentru mesajele trimise de sistem. Unele gazde blochează e-mailurile trimise, cu excepția cazului în care formularul conține o adresă de e-mail reală, care a fost creată din panoul de control al gazdei, așa că vă rugăm să furnizați adresa reală;
- Încărcați toate fișierele și activele index.php, protected.php și include foldere prin FTP pe gazda dvs.;
- Adăugați codul de mai jos la fiecare pagină PHP în care doriți să afișați formularul de autentificare;

Require_once „includes/main.php”; $user = utilizator nou(); if(!$user->loggedIn())( redirect("index.php"); )
- Gata!

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

Primul pas este să scrieți codul HTM pentru formularul de autorizare. Acest cod aflat în fișierul index.php. Acest fișier conține, de asemenea, cod PHP care procesează datele din formular și altele caracteristici utile sisteme de autorizare. Puteți afla mai multe despre acest lucru în secțiunea de mai jos dedicată revizuirii codului PHP.

index.php

Tutorial: Sistem de înregistrare super simplu cu PHP și MySQL Autentificare sau înregistrare

Introdu adresa ta de e-mail mai sus și vom trimite
tu un link de conectare.

Autentificare/Înregistrare

În secțiunea head (între etichete și etichete) am inclus stilurile principale (nu sunt tratate în acest tutorial, așa că le puteți vedea singur. Folder assets/css/style.css). Înainte de tag-ul de închidere am inclus biblioteca jQuery și fișierul script.js, pe care le vom scrie și analiza mai jos.


JavaScript

jQuery urmărește starea butonului „Înregistrare/Autentificare” folosind funcția e.preventDefault()și trimite cereri AJAX. În funcție de răspunsul serverului, acesta afișează unul sau altul mesaj și determină acțiuni suplimentare/

assets/js/script.js

$(function())( var form = $("#login-register"); form.on("trimite", function(e)( if(form.is(".loading, .loggedIn"))( return false ; ) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (e-mail: e-mail), funcția (m)( if(m.error)( form.addClass(„eroare”); messageHolder.text(m.message); ) else( form.removeClass(„eroare”).addClass(„loggedIn”); messageHolder . text(m.message); ) )); )); $(document).ajaxStart(function())( form.addClass(„încărcare”); )); $(document).ajaxComplete(function()) ( form. removeClass("încărcare"); )); ));

a fost adăugat în formular pentru a afișa starea curentă a cererii AJAX (acest lucru a fost posibil datorită metodelor ajaxStart()) Și ajaxComplete(), pe care îl puteți găsi spre sfârșitul fișierului).

Această clasă afișează un fișier GIF animat care se rotește (ca pentru a ne sugera că cererea este în curs de procesare) și acționează, de asemenea, ca un semnalizare pentru a împiedica trimiterea din nou a formularului (atunci când butonul de înregistrare a fost deja apăsat o dată). Clasa .loggedIn este un alt indicator - este setat atunci când e-mailul a fost trimis. Acest flag blochează imediat orice alte acțiuni cu formularul.

Schema bazei de date

Sistemul nostru de logare incredibil de simplu folosește 2 tabele MySQL (codul SQL se află în fișierul tables.sql). Primul stochează date despre conturile de utilizator. Al doilea stochează informații despre numărul de încercări de conectare.


Schema tabelului utilizator.

Sistemul nu folosește parole, așa cum se poate observa în diagramă. Pe ea puteți vedea coloana token cu token-uri adiacente coloanei token_validity. Tokenul este instalat de îndată ce utilizatorul se conectează la sistem și își setează e-mailul să trimită un mesaj (mai multe despre asta în blocul următor). Coloana token_validity setează timpul 10 minute mai târziu, după care jetonul nu mai este valabil.


Schemă de tabel care numără numărul de încercări de autorizare.

În ambele tabele, adresa IP este stocată în formă procesată, folosind funcția ip2long într-un câmp de tip întreg.

Acum putem scrie niște cod PHP. Principala funcționalitate a sistemului este atribuită clasei User.class.php, pe care o puteți vedea mai jos.

Această clasă utilizează în mod activ idorm (docs), aceste biblioteci sunt instrumentele minime necesare pentru lucrul cu bazele de date. Se ocupă de accesul la baza de date, generarea de token și validarea token-ului. Oferă o interfață simplă care facilitează conectarea unui sistem de înregistrare la site-ul dvs. dacă folosește PHP.

User.class.php

Class User( // Private ORM case private $orm; /** * Găsiți un utilizator după indicativ. Numai indicativele valide sunt acceptate pentru considerare. Jetonul este generat doar timp de 10 minute din momentul în care a fost creat * @param șir $token Acesta este cel pe care îl căutăm jetonul * @return User Returnează valoarea funcției User */ public static function findByToken($token)( // găsim jetonul în baza de date și asigurați-vă că este setată marca temporală corectă $result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) return new User($result); ) /** * Autorizați sau înregistrați un utilizator * @param șir $email. Adresa de e-mail a utilizatorului * @return User */ public static function loginOrRegister($email)( // Dacă un astfel de utilizator deja exists, returnează valoarea funcției User de la adresa de e-mail specificată stocată în baza de date if(User::exists($email))( return new User($email); ) // În caz contrar, creați un nou utilizator în baza de date și returnează valoarea funcției User::create de la e-mail specificat return User::create($email); ) /** * Creați un utilizator nou și salvați în baza de date * @param șir $email. Adresa de e-mail a utilizatorului * @return User */ private static function create($email)( // Scrieți un utilizator nou și returnați rezultatul funcției User din aceste valori $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Verificați dacă un astfel de utilizator există în baza de date și returnați valoarea booleană a lui variabila * @param șir $email. Adresa de e-mail a utilizatorului * @return boolean */ funcția publică statică există($email)( // Există utilizatorul în baza de date? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Creați un nou obiect utilizator * @param instanță $param ORM , id, email sau 0 * @return User */ public function __construct($param = null) ( if($param instanceof ORM)( // verificarea ORM a trecut $this->orm = $param; ) else if(is_string($param))( // Verificarea e-mailului a trecut $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // valoarea variabilei $param este transmis la identificatorul de utilizator $id = $param; ) else if(isset($_SESSION["loginid"]))( // În caz contrar, vezi session $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Generați un nou token de autorizare SHA1, îl scrieți în baza de date și returnează valoarea acestuia * @return șir */ public function generateToken( )( // Generați un token pentru un utilizator autorizat și salvați-l în baza de date $token = sha1($this->email.time().rand(0, 1000000)); // Salvați jetonul în baza de date // Și marcați-l ca valabil doar pentru următoarele 10 minute $this->orm->set("token", $token); $this->orm->set_expr("validitate_token", "ADDTIME(ACUM(),"0:10")"); $this->orm->save(); returnează $token; ) /** * Autorizează utilizatorul * @return void */ public function login())( // Marcați utilizatorul ca autentificat $_SESSION["loginid"] = $this->orm->id; // Actualizați valoarea câmpului bazei de date last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Distrugeți sesiunea și deconectați utilizatorul * @return void */ public function logout ()( $_SESSION = array(); unset($_SESSION); ) /** * Verificați dacă utilizatorul este autentificat * @return boolean */ public function loggedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Verifică dacă utilizatorul este administrator * @return boolean */ public function isAdmin())( return $this->rank() = = "administrator"; ) /** * Găsiți tipul de utilizator, poate fi administrator sau obișnuit * @return șir */ public function rank())( dacă ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Metodă care vă permite să obțineți informațiile private ale utilizatorului ca * proprietăți ale obiectului User * @ param șir $key Numele proprietății care primește acces * @return mixed */ public function __get($key)( if(isset($this->orm->$key))( return $this->orm-> $key; ) returnează nul; ) )

Tokenurile sunt generate folosind algoritmul SHA1 și stocate în baza de date. Folosesc funcțiile de sincronizare ale MySQL pentru a seta o limită de timp de 10 minute pentru valabilitatea unui simbol.

Când un token este validat, îi spunem direct managerului că luăm în considerare doar token-urile care nu au expirat încă, stocate în coloana token_validity.

Vă rugăm să rețineți că folosesc metoda magică __obține docs la sfârșitul fișierului pentru a intercepta accesul la proprietățile obiectului User.

Datorită acestui fapt, devine posibilă accesarea informațiilor stocate în baza de date datorită proprietăților $user->email, $user->token etc. În următorul fragment de cod, vom analiza cum să folosim aceste clase ca exemplu .


Pagina protejată

Un alt fișier care stochează funcționalități utile și necesare este fișierul functions.php. Există mai multe așa-numite funcții de ajutor - asistente care vă permit să creați cod mai curat și mai lizibil în alte fișiere.

funcții.php

Funcția send_email($from, $to, $subject, $message)( // Ajutor care trimite email $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Tip conținut: text /plain; charset=utf-8" . "\r\n"; $headers .= "De la: ".$from . "\r\n"; returnează e-mail($to, $subject, $message, $headers ); ) function get_page_url())( // Determinați adresa URL a fișierului PHP $url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://" .$_SERVER [„SERVER_NAME”]; if(isset($_SERVER[”REQUEST_URI”]) && $_SERVER[”REQUEST_URI”] != “”)( $url.= $_SERVER[”REQUEST_URI”]; ) else( $url. = $_SERVER["PATH_INFO"]; ) returnează $url; ) function rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Numărul de încercări de conectare în ultima oră la această adresă IP $ count_hour = ORM: :for_table("reg_login_tempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(ACUM(),"1:00 ")") ->count(); // Numărul de încercări de conectare în ultimele 10 minute la această adresă IP $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u ", ip2long($ ip))) ->where_raw("ts > SUBTIME(ACUM(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new Exception("Prea multe încercări de conectare!"); ) ) function rate_limit_tick($ip, $email)( // Creați o nouă înregistrare în tabel care contează numărul de încercări de conectare $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_tempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip) )); $login_tempt->save(); ) function redirect($url)( header("Locație: $url"); ieșire; )

Funcții rate_limitȘi rate_limit_tick monitorizează numărul de încercări de autorizare în perioada de timp scursă de la prima încercare. Încercarea de conectare este înregistrată în baza de date în coloana reg_login_attempt. Aceste funcții sunt apelate atunci când datele din formular sunt procesate și trimise, așa cum puteți vedea din următorul fragment de cod.

Codul de mai jos este preluat din fișierul index.php și se ocupă de trimiterea formularului. Acesta returnează un răspuns JSON, care, la rândul său, este procesat de jQuery în fișierul assets/js/script.js pe care l-am analizat mai devreme.

index.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Afișează un antet de antet JSON ("Content-type: application/json"); // Este această adresă de e-mail validă dacă (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Vă rugăm să introduceți un e-mail valid."); ) // Verificați. Este utilizatorul a permis să se autentifice, a depășit numărul de conexiuni permise? (fișierul functions.php pentru mai multe informații) rate_limit($_SERVER["REMOTE_ADDR"]); // Înregistrați această încercare de conectare rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["e-mail"]); // Trimiteți un e-mail utilizatorului $message = ""; $email = $_POST["e-mail"]; $subject = "Link-ul dvs. de conectare"; if(!User:: exists($email) )( $subject = „Vă mulțumim pentru înregistrare!”; $message = „Vă mulțumim pentru înregistrarea pe site-ul nostru!\n\n”; ) // Încercarea de a autoriza sau înregistra un utilizator $user = Utilizator ::loginOrRegister($_POST[ "email"]); $message.= "Vă puteți autentifica de la această adresă URL:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Legătura va expira automat după 10 minute."; $rezultat = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( throw new Exception("A apărut o eroare la trimiterea e-mailului. Vă rugăm să încercați din nou."); ) die(json_encode(array("message" => "Vă mulțumim! Am trimis un link) în căsuța dvs. de e-mail. Verificați și folderul de spam."))); ) ) catch(Excepție $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage()) ))); )

După autentificare/înregistrare cu succes, codul de mai sus va trimite utilizatorului un link de conectare. Jetonul devine disponibil deoarece este transmisă ca o variabilă în legătura generată prin metodă $_GET cu marker tkn

index.php

If(isset($_GET["tkn"]))( // Este acest token valid pentru autorizare? $user = User::findByToken($_GET["tkn"]); if($user)( // Da , este. Redirecționează către o pagină protejată $user->login(); redirect("protected.php"); ) // Nu, simbolul nu este valid. Redirecționează către o pagină cu un formular de autorizare/înregistrare redirect("index. php ");)

$user->login()

va crea variabilele necesare sesiunii, astfel incat utilizatorul, vizualizand paginile ulterioare ale site-ului, sa ramana autorizat in orice moment.

Procesarea funcției de ieșire din sistem este aranjată într-un mod similar.

index.php

If(isset($_GET["logout"]))( $user = utilizator nou(); if($user->loggedIn())( $user->logout(); ) redirect("index.php") ;)

La sfârșitul codului, am setat din nou o redirecționare către index.php, deci parametrul ?logout=1 transmis prin URL nu este necesar.

Fișierul nostru index.php necesită suplimentar. protecție - nu dorim ca persoanele care s-au autentificat în sistem să vadă din nou formularul de înregistrare. În aceste scopuri, folosim metoda $user->loggedIn().

index.php

$user = utilizator nou(); if($user->loggedIn())( redirect("protected.php"); )

În sfârșit, iată o bucată de cod care vă permite să protejați paginile site-ului dvs. și să îl faceți accesibil doar după autorizare.

protejat.php

// Pentru a proteja fiecare pagină de pe site-ul dvs., includeți un fișier main.php // și creați un nou obiect User. Asa este de usor! require_once "includes/main.php"; $user = utilizator nou(); if(!$user->loggedIn())( redirect("index.php"); )

După această verificare, puteți fi sigur că utilizatorul a fost autorizat cu succes. De asemenea, puteți accesa informațiile stocate în baza de date folosind proprietățile obiectului $utilizator. Pentru a afișa adresa de e-mail și starea utilizatorului, utilizați acest cod:

Echo „E-mailul tău: „.$user->email; echo "Rangul dvs.: ".$user->rank();

Metodă rang() folosit aici deoarece numerele sunt de obicei stocate în baza de date (0 pentru utilizator obișnuit, 1 pentru administrator) și trebuie să convertim aceste date în stările la care se referă, ceea ce ne ajută această metodă.

Pentru a face un utilizator obișnuit administrator, pur și simplu editați intrarea utilizatorului prin phpMyAdmin (sau orice alt program care vă permite să gestionați baze de date). Starea de administrator nu oferă niciun privilegiu, inclusiv în acest exemplu pagina va afișa că sunteți administrator - și asta este tot.

Dar ce să faci cu asta este lăsat la discreția ta; poți scrie și compune singur cod care stabilește anumite privilegii și capacități pentru administratori.

Au fost efectuate!

Am terminat cu această formă incredibil de super cvasi simplă! Îl poți folosi în site-urile tale PHP, este destul de simplu. De asemenea, îl puteți modifica pentru dvs. și îl puteți face așa cum doriți.

Materialul a fost pregătit de Denis Malyshok special pentru site-ul web

P.S. Vrei să mergi mai departe în stăpânirea PHP și OOP? Acordați atenție lecțiilor premium despre diverse aspecte ale construirii site-ului web, inclusiv programarea în PHP, precum și un curs gratuit despre crearea propriului dvs. sistem CMS în PHP de la zero folosind OOP:

Ți-a plăcut materialul și vrei să-mi mulțumești?
Distribuie doar prietenilor și colegilor tăi!