Lihtsa kasutaja registreerimissüsteemi loomine PHP-s ja MySQL-is. Uskumatult lihtsa PHP ja MySQL-i registreerimissüsteemi PHP registreerimislehe loomine

Reg.ru: domeenid ja hostimine

Venemaa suurim registripidaja ja hostingu pakkuja.

Kasutusel on üle 2 miljoni domeeninime.

Reklaam, e-post domeenile, lahendused ärile.

Rohkem kui 700 tuhat klienti üle maailma on juba oma valiku teinud.

* Kerimise peatamiseks hõljutage kursorit.

Tagasi ette

Lihtsa kasutaja registreerimissüsteemi loomine PHP-s ja MySQL-is

Registreerimissüsteemi loomine on suur töö. Peate kirjutama koodi, mis kinnitab e-posti aadresse, saadab registreerimise kinnitusmeili, kinnitab ülejäänud vormiväljad ja palju muud.

Ja isegi pärast selle kõige kirjutamist ei soovi kasutajad registreeruda, sest. see nõuab neilt pingutust.

Selles õpetuses loome väga lihtsa sisselogimissüsteemi, mis ei nõua ega salvesta üldse paroole! Tulemust on lihtne muuta ja lisada juba olemasolevale PHP saidile. Kas soovite teada saada, kuidas see töötab? Loe altpoolt.



Meie ülilihtne süsteem toimiks järgmiselt.

Ühendame autoriseerimisvormi ja registreerimise. Sellel vormil on väli e-posti aadressi sisestamiseks ja registreerimisnupp;
- E-posti aadressiga välja täitmisel registreerimisnupul vajutades luuakse kirje uue kasutaja kohta, kuid ainult juhul, kui sisestatud meiliaadressi andmebaasist ei leitud.

Pärast seda luuakse teatud juhuslik unikaalne märgikomplekt (märk), mis saadetakse kasutaja määratud kirjale lingi kujul, mis on asjakohane 10 minutit;
- Lingil klõpsates läheb kasutaja meie veebisaidile. Süsteem määrab märgi olemasolu ja volitab kasutajat;

Selle lähenemisviisi eelised:

Pole vaja salvestada paroole ja kinnitada välju;
- Pole vaja parooli taastamist, salaküsimusi jne;
- Alates hetkest, kui kasutaja on registreerunud/sisse loginud, võite alati olla kindel, et see kasutaja on teie juurdepääsutsoonis (e-posti aadress on tõene);
- Uskumatult lihtne registreerimisprotsess;

Puudused:

Kasutajakonto turvalisus. Kui kellelgi on juurdepääs kasutaja kirjadele, saab ta sisse logida.
- E-post ei ole turvaline ja seda saab pealt kuulata. Pidage meeles, et see küsimus on asjakohane ka juhul, kui parool on ununenud ja vajab taastamist, või mis tahes autoriseerimissüsteemis, mis ei kasuta andmeedastuseks HTTPS-i (sisselogimine / parool);
- Kuni seadistate meiliserveri vastavalt vajadusele, on võimalus, et autoriseerimislinkidega kirjad satuvad rämpsposti;

Võrreldes meie süsteemi eeliseid ja puudusi, võib öelda, et süsteemil on kõrge kasutatavus (maksimaalne mugavus lõppkasutajale) ja samal ajal madal turvaindikaator.

Seetõttu tehakse ettepanek kasutada seda registreerimiseks foorumites ja teenustes, mis ei tööta olulise teabega.

Kuidas seda süsteemi kasutada

Kui teil on vaja lihtsalt süsteemi kasutada oma saidil kasutajate volitamiseks ja te ei soovi seda õppetundi lahti võtta, peate tegema järgmist.

Peate alla laadima õppetunnile lisatud lähtefailid
- Otsige arhiivist üles fail tables.sql, importige see oma andmebaasi kasutades phpMyAdmini importimisvalikut. Alternatiivne viis: ava see fail tekstiredaktoriga, kopeeri SQL päring ja käivita see;
- Ava include/main.php ja täitke oma andmebaasiga ühenduse loomise seaded (määrake andmebaasiga ühenduse loomiseks kasutaja ja parool, samuti andmebaasi host ja nimi). Samas failis tuleb määrata ka meiliaadress, mida kasutatakse süsteemi saadetavate sõnumite algse aadressina. Mõned hostid blokeerivad väljaminevad meilid, kuni vorm kuvab tõelise e-posti aadressi, mis loodi hosti juhtpaneelilt, seega sisestage tegelik aadress;
- Laadige kõik index.php , protected.php failid ja varad ning kaustad FTP kaudu oma hosti üles;
- Lisage allolev kood igale PHP lehele, kus soovite autoriseerimisvormi kuvada;

Require_once "includes/main.php"; $kasutaja = uus kasutaja(); if(!$user->loggedIn())( redirect("index.php"); )
- Valmis!

Keda huvitab, kuidas see kõik toimib, lugege allpool!

Esimene samm on autoriseerimisvormi HTM-koodi kirjutamine. See kood asub failis index.php. See fail sisaldab ka PHP-koodi, mis käsitleb vormiandmeid ja muid autoriseerimissüsteemi kasulikke funktsioone. Lisateavet selle kohta leiate allolevast PHP-koodi ülevaate jaotisest.

index.php

Õpetus: ülilihtne registreerimissüsteem PHP ja MySQL-iga sisselogimine või registreerumine

Sisesta oma e-posti aadress ja me saadame
sa sisselogimise link.

Logi sisse/Registreeru

Peaosa (ja siltide vahele) lisasin peamised stiilid (neid selles õpetuses ei käsitleta, nii et saate neid ise vaadata. kaust vara/css/style.css). Enne sulgevat silti lisasin jQuery teegi ja faili script.js, mida me allpool kirjutame ja analüüsime.


JavaScript

jQuery jälgib funktsiooniga nupu "Registreeru/Logi sisse" olekut e.preventDefault() ja saadab AJAX-i päringuid. Sõltuvalt serveri vastusest kuvab konkreetse teate ja määrab edasised toimingud /

Varad/js/script.js

$(function()( var form = $("#login-register"); form.on("submit", function(e)( if(form.is(".loading, .loggedIn"))( return false ; ) var email = vorm.find("sisend").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (e-post: email), funktsioon (m)( if(m.error)( form.addClass("viga"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("sisse logitud"); messageHolder. text(m.message); ) )); )); $(document).ajaxStart(function()( form.addClass("laadimine"); )); $(document).ajaxComplete(function()( vorm. removeClass("laadimine"); )); ));

lisati vormile, et kuvada AJAX-i päringu hetkeseisund (see sai võimalikuks tänu meetoditele ajaxStart()) Ja ajaxComplete(), mille leiate faili lõpust).

See klass näitab keerlevat animeeritud gif-faili (nagu vihjab meile, et taotlust töödeldakse) ja toimib ka lipuna, mis takistab vormi uuesti esitamist (kui registreerimisnupul on juba üks kord klõpsatud). Klass .loggedIn on veel üks lipp – määratud e-kirja saatmise ajal. See lipp blokeerib koheselt kõik edasised toimingud vormil.

Andmebaasi skeem

Meie uskumatult lihtne logimissüsteem kasutab 2 MySQL-i tabelit (SQL-i kood on failis tables.sql). Esimene salvestab andmed kasutajakontode kohta. Teine salvestab teavet sisselogimiskatsete arvu kohta.


Kasutaja tabeli skeem.

Süsteem ei kasuta paroole, mida on näha diagrammil. Sellel näete ka märgi veergu koos märkidega, mis on veeru token_validity kõrval. Token seatakse kohe, kui kasutaja loob ühenduse süsteemiga, seab oma e-posti sõnumi saatma (sellest veidi lähemalt järgmises plokis). Veerg token_validity määrab aja 10 minutiks hilisemaks, pärast mida luba enam ei kehti.


Tabeliskeem, mis loeb autoriseerimiskatsete arvu.

Mõlemas tabelis salvestatakse IP-aadress töödeldud kujul, kasutades funktsiooni ip2long, täisarvuväljal.

Nüüd saame kirjutada PHP koodi. Süsteemi põhifunktsioonid on määratud User.class.php klassile, mida näete allpool.

See klass kasutab aktiivselt idormi (docs), need teegid on minimaalsed vajalikud tööriistad andmebaasidega töötamiseks. See tegeleb andmebaasi juurdepääsu, märgi genereerimise ja valideerimisega. See on lihtne liides, mis hõlbustab registreerimissüsteemi ühendamist saidiga, kui see kasutab PHP-d.

user.class.php

Klassi kasutaja( // Privaatne ORM-juhtum . See on see, mida otsite märgiks * @return User Tagastab funktsiooni User väärtuse */ avalik staatiline funktsioon findByToken($token)( // leidke andmebaasist märk ja veenduge, et õige ajatempel on määratud $ result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->leia_one();if(!$tulemus)( return false; ) return new User($result); ) /** * Kasutaja autoriseerimine või registreerimine * @param string $email.Kasutaja meiliaadress * @return User */ public staatiline funktsioon loginOrRegister($email)( // Kui selline kasutaja on juba olemas, tagastab funktsiooni User väärtuse määratud e-posti aadressilt, mis on salvestatud andmebaasi if(User::exists($email))( return new User($email); ) // Vastasel juhul looge uus kasutaja andmebaasi ja tagastab funktsiooni User::create väärtuse määratud meilist return User::create($email ); ) /** * Loo uus kasutaja ja salvesta andmebaasi * @param string $email. Kasutaja e-posti aadress * @return User */ privaatne staatiline funktsioon create($email)( // Registreerige uus kasutaja ja tagastage funktsiooni User tulemus nendest väärtustest>$result = ORM::for_table("reg_users")- >loo(); $result->email = $email; $result->save(); tagasta uus kasutaja($result); ) /** * Kontrolli, kas selline kasutaja on andmebaasis olemas ja tagastab tõeväärtuse muutuja * @param string $email. Kasutaja meiliaadress * @return Boolean */ public staatiline funktsioon eksisteerib($email)( // Kas kasutaja on andmebaasis olemas? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Loo uus kasutajaobjekt * @param eksemplar $param ORM , id, email või 0 * @return User */ public function __construct($param = null) ( if($param instanceof ORM)( // ORM-i kontroll läbis $this->orm = $param; ) else if(is_string($param))( // E-posti kontroll läbis $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(on_numeric($param))( // kasutaja ID edastatakse väärtuse $ parameetri muutuja $id = $param; ) else if(isset($_SESSION["loginid"]))( // Muul juhul vaadake seanssi $id = $_SESSION["loginid"]; ) $this->orm = ORM:: for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Looge uus SHA1 autoriseerimisluba, kirjutage see andmebaasi ja tagastage selle väärtus * @return string * / public function generateToken( )( // Looge volitatud kasutajale märk ja salvestage see andmebaasi $token = sha1($this->email.time().rand(0, 1000000)); // Token salvestatakse andmebaasi // Ja märgitakse kehtivaks ainult järgmised 10 minutit $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); tagasta $märk; ) /** * Kasutaja autoriseerimine * @return void */ public function login()( // Märgi kasutaja sisselogituks $_SESSION["loginid"] = $this->orm->id; // Värskenda väärtust andmebaasi väljast last_login $this->orm->set_expr("viimane_sisselogimine", "NOW()"); $this->orm->save(); ) /** * Hävitage seanss ja logige kasutaja välja * @return void */ avaliku funktsiooni väljalogimine ()( $_SESSION = array(); unset($_SESSION); ) /** * Kontrollige, kas kasutaja on sisse logitud * @return Boolean */ public function loggedIn()( return isset($ this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Kontrollige, kas kasutaja on administraator * @return Boolean */ avalik funktsioon isAdmin() ( return $this->rank() = = "administraator"; ) /** * Leia kasutaja tüüp, võib olla administraator või tavaline * @return string */ avalik funktsioon rank()( if($this->orm- >rank == 1)( return "administrator "; ) return "regular"; ) /** * Meetod, mis võimaldab hankida kasutaja privaatset teavet *kasutajaobjekti atribuutidena * @param string $key Nimi atribuut, mis saab juurdepääsu * @return mix */ avalik funktsioon __get($key)( if(isset($this->orm->$key))( return $this->orm->$key; ) tagasta null; ) )

Tokenid genereeritakse SHA1 algoritmi abil ja salvestatakse andmebaasi. Kasutan MySQL-i ajafunktsioone, et määrata 10-minutilise märgi aegumislimiit.

Kui luba läbib valideerimisprotseduuri, ütleme töötlejale otse, et arvestame ainult neid märke, mis ei ole veel aegunud ja on salvestatud veergu token_validity.

Pange tähele, et ma kasutan maagilist meetodit __saada docs teegi faili lõpus, et peatada juurdepääs kasutaja objekti atribuutidele.

See võimaldab juurdepääsu andmebaasi salvestatud teabele, kasutades atribuute $user->email, $user->token ja muid atribuute. Järgmises koodilõigul vaatame näitena, kuidas neid klasse kasutada.


Kaitstud leht

Teine fail, mis salvestab kasulikke ja vajalikke funktsioone, on fail functions.php. Siin on mitmeid nn abistajaid - abifunktsioone, mis võimaldavad luua teistesse failidesse puhtamat ja loetavamat koodi.

funktsioonid.php

Funktsioon send_email($from, $to, $subject, $message)( // Abimees, kes saadab meili $headers = "MIME-versioon: 1.0" . "\r\n"; $headers .= "Sisutüüp: tekst /plain; charset=utf-8" . "\r\n"; $headers .= "Saatja: ".$saatja ); ) funktsioon get_page_url()( // Hangi PHP-faili URL $url = "http".(tühi($_SERVER["HTTPS"])?"":"s")."://".$_SERVER [ "SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) else( $url. = $_SERVER["PATH_INFO"]; ) tagastab $url; ) funktsioon rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Sisselogimiskatsete arv viimase tunni jooksul sellel IP-aadressil $count_hour = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00")") ->count(); // Sisselogimiskatsete arv viimase 10 minuti jooksul sellel IP-aadressil $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long( $ ip))) ->kus_raw("ts > SUBTIME(NOW(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new Exception("Liiga palju sisselogimiskatseid!"); ) ) function rate_limit_tick($ip, $email)( // Loo tabelisse uus kirje sisselogimiskatsete loendus $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip) ); $login_attempt->save(); ) function redirect($url)( header("Asukoht: $url"); välju; )

Funktsioonid rate_limit Ja rate_limit_tick jälgida autoriseerimiskatsete arvu esimesest katsest möödunud aja jooksul. Sisselogimiskatse salvestatakse andmebaasi veergu reg_login_attempt. Neid funktsioone kutsutakse välja vormiandmete töötlemisel ja esitamisel, nagu näete järgmisest koodilõigust.

Allolev kood on võetud failist index.php ja see käsitleb vormi esitamist. See tagastab JSON-vastuse, mida jQuery omakorda töötleb failis resources/js/script.js, mida oleme juba käsitlenud.

index.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Väljutage JSON-i päise päis("Content-type: application/json"); // Kas see e-posti aadress on kehtiv, kui (!isset($_POST["e-post"]) || !filter_var($_POST["e-post"], FILTER_VALIDATE_EMAIL))( throw new Exception("Palun sisestage kehtiv e-posti aadress."); ) // Kontrollige. Kas kasutajal on lubatud sisse logida, kas ta on ületanud lubatud ühenduste arvu? (lisateabe saamiseks fail functions.php) rate_limit($_SERVER["REMOTE_ADDR"]); // Salvestage see sisselogimiskatse rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Saada kasutajale e-kiri $message = ""; $email = $_POST["e-post"]; $subject = "Teie sisselogimislink"; if(!Kasutaja:: eksisteerib($email) )( $subject = "Aitäh registreerumast!"; $message = "Täname, et registreerusite meie saidil!\n\n"; ) // Kasutaja autoriseerimise või registreerimise katse $user = Kasutaja ::loginOrRegister($_POST[ "email"]); $message.= "Saad sisse logida sellelt URL-ilt:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Link aegub automaatselt 10 minuti pärast."; $tulemus = send_email($fromEmail, $_POST["email"], $teema, $sõnum); if(!$result)( throw new Exception("Teie meili saatmisel ilmnes viga. Palun proovi uuesti."); ) die(json_encode(array("message" => "Aitäh! Oleme saatnud lingi oma postkasti. Kontrollige ka oma rämpsposti kausta.")))); ) ) catch(Erand $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage( ))));)

Pärast edukat autoriseerimist/registreerimist saadab ülaltoodud kood kasutajale autoriseerimiseks lingi. Märk muutub kättesaadavaks, kuna see edastatakse meetodi abil genereeritud lingis muutujana $_GET markeriga tkn

index.php

If(isset($_GET["tkn"]))( // Kas see luba kehtib autoriseerimiseks? $user = User::findByToken($_GET["tkn"]); if($user)( // Jah , on. Ümbersuunamine kaitstud lehele $user->login(); redirect("protected.php"); ) // Ei, märk ei kehti. Suuna sisselogimis-/registreerimisvormiga lehele redirect("index. php");)

$kasutaja->sisselogimine()

loob seansi jaoks vajalikud muutujad, nii et kasutaja, kes vaatab saidi järgmisi lehti, jääb kogu aeg volitatud.

Samamoodi on korraldatud süsteemist väljumise funktsiooni töötlemine.

index.php

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

Koodi lõpus suunasin uuesti index.php-le, seega parameeter ?logout=1 URL-i kaudu edastatud pole nõutav.

Meie index.php fail nõuab lisa. kaitse – me ei soovi, et inimesed, kes on kunagi süsteemi sisse loginud, näeksid uuesti registreerimisvormi. Nendel eesmärkidel kasutame meetodit $user->loggedin().

index.php

$kasutaja = uus kasutaja(); if($user->loggedIn())( redirect("protected.php"); )

Lõpuks on siin koodijupp, mis võimaldab teil saidi lehti kaitsta ja teha need kättesaadavaks alles pärast autoriseerimist.

kaitstud.php

// Iga saidi lehe kaitsmiseks lisage fail // main.php ja looge uus kasutajaobjekt. Nii lihtne see ongi! nõuda_once "includes/main.php"; $kasutaja = uus kasutaja(); if(!$user->loggedIn())( redirect("index.php"); )

Pärast seda kontrolli võite olla kindel, et kasutaja autoriseerimine õnnestus. Andmebaasi salvestatud teabele pääsete juurde ka objekti atribuutide abil $kasutaja. Kasutaja e-posti ja oleku kuvamiseks kasutage seda koodi:

echo "Teie meil: ".$user->email; echo "Teie auaste: ".$user->rank();

meetod koht() kasutatakse siin, kuna numbrid salvestatakse tavaliselt andmebaasi (0 tavakasutaja jaoks, 1 administraatori jaoks) ja me peame need andmed teisendama olekutesse, kuhu need kuuluvad, mida see meetod meid aitab.

Tavakasutaja administraatoriks muutmiseks muutke lihtsalt kasutaja kirjet phpMyAdmini (või mõne muu andmebaaside haldamist võimaldava programmi) kaudu. Administraatori staatus ei anna mingeid õigusi, selles näites kuvatakse lehel, et olete administraator – ja kõik.

Aga mis sellega teha - see jääb teie äranägemisele, saate ise kirjutada ja koostada koodi, mis määrab administraatoritele teatud privileegid ja võimalused.

Oleme valmis!

Selle uskumatult ülilihtsa kujuga oleme valmis! Saate seda kasutada oma PHP-saitidel, see on üsna lihtne. Saate seda ka enda jaoks muuta ja teha nii, nagu soovite.

Materjali valmistas spetsiaalselt saidi jaoks ette Denis Malyshok

P.S. Kas soovite PHP ja OOP valdamises edasi liikuda? Vaadake esmaklassilisi õpetusi veebisaitide loomise erinevate aspektide, sealhulgas PHP programmeerimise kohta, ning tasuta kursust oma PHP CMS-süsteemi nullist ülesehitamiseks OOP-i abil:

Kas teile meeldis materjal ja soovite tänada?
Lihtsalt jaga oma sõprade ja kolleegidega!


Viimati muutis Vincy 23. juulil 2019.

Kasutaja registreerimine või registreerumine on paljude veebirakenduste lahutamatu osa ja rakenduse õnnestumiseks on ülioluline, et see oleks õige. See on lähtepunkt kasutaja seotuks teie rakendusega.

See peaks olema parima kasutajaliidese / UX-iga võimalikult lihtne. Kasutaja registreerimisfunktsiooni rakendamine PHP-ga on lihtne ülesanne ja ma juhendan teid selles artiklis näidete abil.

Mis on sees? Kuidas see PHP kasutaja registreerimise näide töötab?

Selle näidiskoodi saab jagada kolmeks osaks.

  • Kasutajateabe hankimine HTML-vormi kaudu.
  • Kasutaja esitatud teabe kinnitamine vormi esitamisel.
  • Andmebaasi käsitlemine registreeritud kasutaja salvestamiseks andmebaasi pärast valideerimist.
  • Kolmas samm käivitatakse pärast seda, kui on tagatud, et kasutajat pole juba lisatud. See andmete unikaalsuse valideerimine toimub nende sisestatud e-posti aadressi ja kasutajanime alusel.

    Registreerimisel kogume üldjuhul kasutajate andmeid, kes on valmis meie rakendusega registreeruma. Mõned neist on kohustuslikud ja mõned valikulised.

    Seega võib see funktsioon sisaldada ka valideerimisosa, et tagada kasutajaandmete mittetühjus ja vorming. Valideerimist saab teha kas kliendi- või serveripoolses osas.

    Serveripoolne valideerimine on alati parem. Saate valida selle kliendipoolseks kasutamiseks ka kasutajate kasutusmugavuse huvides. Kuid serveripoolne olemasolu pole vabatahtlik ja miinimumnõue.

    faili struktuur

    HTML-vorm, mis võimaldab kasutajal registreeruda

    Selles näites sisaldab registreerimisvorm välju Kasutajanimi, Nimi (kuvanimi), Parool ja E-post. Sellel on ka väli Kinnita parool, mis võimaldab kasutajal kinnitamiseks oma parooli uuesti sisestada. Neid kahte parooli võrreldakse hiljem .

    Selle vormi esitamisega eeldatakse, et kasutaja nõustub tingimustega. Seega lisatakse selle tagamiseks linnuke väli nupu Registreeru ette.

    PHP kasutaja registreerimisvorm Registreeru kasutajanimi