Heeft u ooit een account bij een website gemaakt en bent u verplicht om uw e-mail te controleren en door een verificatielink te klikken die door het bedrijf is verzonden om deze te activeren? Hierdoor wordt het aantal spam-accounts sterk verminderd. In deze les leren we hoe we dit precies moeten doen!
In deze zelfstudie leer je van begin af aan een e-mailverificatiescript te maken, maar als je iets wilt dat je direct op je website kunt gebruiken, bekijk dan Email Verify on Envato Market.
Email Verify is een PHP-script waarmee u e-mailadressen kunt verifiëren zonder iets in databases op te slaan. Het zal gebruikers een e-mail sturen die hen verplicht om op een link te klikken om hun e-mail te verifiëren voordat hun e-mail wordt toegevoegd aan datgene waaraan u het wilt toevoegen.
Email Verify op Envato MarketWe gaan een mooi PHP sign-upscript bouwen waarin een gebruiker een account kan maken om toegang te krijgen tot een "ledengedeelte" van een website.
Nadat de gebruiker zijn account heeft aangemaakt, wordt het account vergrendeld totdat de gebruiker op een verificatielink klikt die hij in zijn e-mailinbox ontvangt..
We hebben eerst een eenvoudige pagina nodig waarop onze bezoekers hun accounts kunnen registreren; dus dat is het eerste dat we zullen bouwen.
Ik wil u eraan herinneren dat dit een PHP-zelfstudie is en ik denk dat u de basisbegrippen van HTML moet kennen voordat u verdergaat met PHP. Ik zal opmerkingen toevoegen aan de HTML & CSS om elke regel met code te beschrijven.
index.php - Dit is onze aanmeldingspagina met een basisformulier.
NETTUTS> Aanmelden NETTUTS> Aanmelden
Aanmeldingsformulier
Voer uw naam en e-mailadres in om uw account aan te maken
css / style.css - Dit is een stylesheet voor index.php en meer pagina's.
/ * Algemene stijlen * / * opvulling: 0; / * Reset alle opvulling naar 0 * / marge: 0; / * Reset alle marge naar 0 * / body background: # F9F9F9; / * HTML-achtergrondkleur instellen * / font: 14px "Lucida Grande"; / * Globale lettergrootte instellen & familie * / kleur: # 464646; / * Globale tekstkleur instellen * / p margin: 10px 0px 10px 0px; / * Voeg wat opvulling toe aan de boven - en onderkant van detags * / / * Header * / #header height: 45px; / * Stel kophoogte * / achtergrond in: # 464646; / * Achtergrondkleur van koptekst instellen * / #kop h3 kleur: # FFFFF3; / * Set koptekst kop (titel linksboven) kleur * / opvulling: 10px; / * Stel opvulling in, om het in de kop te centreren * / font-weight: normal; / * Stel het lettertype in op normaal, standaard ingesteld op vet * / / * Wrap * / #wrap background: #FFFFFF; / * Inhoudsachtergrond instellen op wit * / width: 615px; / * Stel de breedte in van ons inhoudsgebied * / marge: 0 auto; / * Centreer onze inhoud in onze browser * / margin-top: 50px; / * Marge top om wat ruimte tussen de header en de inhoud te maken * / opvulling: 10px; / * Opvulling om meer ruimte te maken voor onze tekst * / border: 1px solid #DFDFDF; / * Kleine rand voor de finishing touch * / text-align: center; / * Centreer onze inhoudstekst * / #wrap h3 font: italic 22px Georgia; / * Lettertype instellen voor onze kop 2 die in onze wrap wordt weergegeven * / / * Formulier- en invoerveldstijlen * / vorm margin-top: 10px; / * Maak wat meer afstand van de omschrijvingstekst * / formulier .submit_button background: # F9F9F9; / * Knopachtergrond instellen * / border: 1px solid #DFDFDF; / * Kleine rand rondom onze submit-knop * / opvulling: 8px; / * Voeg wat meer ruimte toe rond onze knoptekst * / invoer font: normal 16px Georgia; / * Zet lettertype voor onze invoervelden * / border: 1px solid #DFDFDF; / * Kleine rand rondom ons invoerveld * / opvulling: 8px; / * Voeg wat meer ruimte toe rond onze tekst * /
Zoals je kunt zien, heb ik een opmerking toegevoegd aan elke regel die beschrijft wat ze doen. Het kan ook zijn dat u de volgende opmerking in het index.php-bestand hebt opgemerkt:
We gaan onze PHP schrijven tussen deze twee lijnen!
Het eerste dat we gaan bouwen is een stuk code dat de informatie gaat valideren. Hier is een korte lijst met details over wat er moet gebeuren.
Dus onze eerste stap is controleren of het formulier wordt verzonden en of de velden niet leeg zijn.
Tijd voor een storing! We beginnen met een IF-verklaring en we valideren eerst het naamveld:
if () // Als statement true is, voer de code tussen haakjes uit isset ($ _ POST ['name']) // Wordt het naamveld gepost; het maakt niet uit of het leeg of gevuld is. && // Dit is hetzelfde als de AND in onze verklaring; Hiermee kunt u meerdere instructies controleren. ! empty ($ _ POST ['name']) // Controleer of de veldnaam niet leeg is isset ($ _ POST ['email']) // Wordt het e-mailveld gepost; het maakt niet uit of het leeg of gevuld is. && // Dit is hetzelfde als de AND in onze verklaring; Hiermee kunt u meerdere instructies controleren. ! empty ($ _ POST ['email']) // Controleer of het veldbericht niet leeg is
Dus als u het formulier nu met lege velden zou indienen, gebeurt er niets. Als u beide velden invult, voert ons script de code uit tussen de haakjes.
Nu gaan we een stuk code maken dat controleert of een e-mailadres geldig is. Als dit niet het geval is, sturen we een foutmelding. Laten we ook onze postvariabelen omzetten naar lokale variabelen:
if (isset ($ _ POST ['name']) &&! empty ($ _ POST ['name']) EN isset ($ _ POST ['email']) &&! empty ($ _ POST ['email'])) $ name = mysql_escape_string ($ _ POST ['name']); // Zet onze post in een lokale variabele $ email = mysql_escape_string ($ _ POST ['email']); // Verander ons bericht in een lokale variabele
We kunnen onze gegevens nu bereiken via onze lokale variabelen. Zoals je ziet, heb ik ook een MySQL-escape-string toegevoegd om MySQL-injectie te voorkomen bij het invoegen van de gegevens in de MySQL-database.
"De functie mysql_real_escape_string () escapeert speciale tekens in een tekenreeks voor gebruik in een SQL-instructie."
De volgende is een klein fragment dat controleert of het e-mailadres geldig is.
$ name = mysql_escape_string ($ _ POST ['name']); $ email = mysql_escape_string ($ _ POST ['email']); if (eregi ( "^ [_ a-z0-9 -]! + (\ [_ a-z0-9 -]. +) * @ [a-z0-9 -]. + (\ [a-z0-9- ] +) * (\. [az] 2,3) $ ", $ email)) // Retourfout - Ongeldige e-mail else // Succesvol rendement - Geldig e-mailadres
Merk op dat ik deze reguliere expressie niet persoonlijk heb geschreven, het is een klein fragment van php.net.
Kortom, het controleert of de e-mail in het volgende formaat is geschreven:
[email protected]
Nu in de eregi kun je zien dat het controleert of de e-mail tekens uit het alfabet bevat, of het een nummer heeft, of een phantom-streepje (_), en natuurlijk de basisvereisten voor een e-mail (e-mail) '@' en een punt)'.' Als geen van deze tekens wordt gevonden, retourneert de uitdrukking "false". Oké, dus nu moeten we wat basisfoutmeldingen toevoegen.
if (eregi ( "^ [_ a-z0-9 -]! + (\ [_ a-z0-9 -]. +) * @ [a-z0-9 -]. + (\ [a-z0-9- ] +) * (\. [az] 2,3) $ ", $ email)) // Retourfout - Ongeldige e-mail $ msg = 'De e-mail die u hebt ingevoerd is ongeldig, probeer het opnieuw.'; else // Succesvol teruggeven - Geldig e-mailadres $ msg = 'Uw account is aangemaakt,
verifieer het door op de activatielink te klikken die naar uw e-mail is gestuurd. ';
Zoals je ziet hebben we een lokale variabele "$ msg" gemaakt, dit laat ons toe om de foutmelding of het succesbericht ergens op de pagina te tonen.
En we gaan het weergeven tussen de instructietekst en het formulier.
Aanmeldingsformulier
Voer uw naam en e-mailadres in om uw account aan te maken
'$ Msg.'
Voeg dit toe aan style.css, om ons statusbericht een beetje op te maken.
#wrap .statusmsg font-size: 12px; / * Stel berichtlettergrootte * / opvulling in: 3px; / * Sommige opvulling om meer ruimte te maken voor onze tekst * / achtergrond: #EDEDED; / * Voeg een achtergrondkleur toe aan ons statusbericht * / border: 1px solid #DFDFDF; / * Voeg een rand toe rond ons statusbericht * /
Nu moeten we een databaseverbinding tot stand brengen en een tabel maken om de accountgegevens in te voegen. Dus laten we naar PHPMyAdmin gaan en een nieuwe database met de naam maken registraties en maak een gebruikersaccount aan dat toegang heeft tot die database om gegevens in te voegen en bij te werken.
Laten we onze maken gebruikers tafel, met 5 velden:
Dus nu moeten we details voor deze velden invoeren:
Voor degenen die deze gegevens niet handmatig willen invoeren, kunt u in plaats daarvan de volgende SQL-code uitvoeren.
MAAK TAFEL 'users' ('id' INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY, 'gebruikersnaam' VARCHAR (32) NOT NULL, 'wachtwoord' VARCHAR (32) NOT NULL, 'email' TEXT NOT NULL, 'hash' VARCHAR (32) NOT NULL, 'active' INT (1) NOT NULL DEFAULT '0') ENGINE = MYISAM;
Onze database is gemaakt, nu moeten we een verbinding tot stand brengen met behulp van PHP. We zullen de volgende code aan het begin van ons script schrijven, net onder de volgende regel:
We zullen de volgende code gebruiken om verbinding te maken met de databaseserver en de te selecteren registraties database. (standaard MySQL-verbinding)
mysql_connect ("localhost", "gebruikersnaam", "wachtwoord") of die (mysql_error ()); // Maak verbinding met de databaseserver (localhost) met gebruikersnaam en wachtwoord. mysql_select_db ("registrations") of die (mysql_error ()); // Selecteer registratiedatabase.Nu we een verbinding met onze database tot stand hebben gebracht, kunnen we doorgaan naar de volgende stap en de accountgegevens invoegen.
Stap 4 - Account invoegen
Nu is het tijd om de ingediende accountgegevens in onze database in te voeren en een activeringshash te genereren. Schrijf de volgende code onder deze regel:
// Succesvolle terugkeer - Geldige e-mail $ msg = 'Uw account is aangemaakt,
verifieer het door op de activatielink te klikken die naar uw e-mail is gestuurd. ';Activering Hash
In onze database hebben we een veld met hash gemaakt, deze hash is een tekstregel van 32 tekens. We sturen deze code ook naar het e-mailadres van de gebruiker. Vervolgens kunnen ze op de koppeling klikken (die de hash bevat) en we zullen controleren of deze overeenkomt met die in de database. Laten we een lokale variabele met de naam $ hash maken en een willekeurige md5-hash genereren.
$ hash = md5 (rand (0,1000)); // Genereer willekeurige hash van 32 tekens en wijs deze toe aan een lokale variabele. // Voorbeelduitvoer: f4552671f8909587cf485ea990207f3bWat hebben we gedaan? Welnu, we gebruiken de PHP-functie "rand" om een willekeurig getal tussen 0 en 1000 te genereren. Vervolgens zal onze MD5-functie dit nummer veranderen in een reeks van 32 tekens die we zullen gebruiken in onze activeringsmail. Mijn keuze is om MD5 te gebruiken, want het genereert een hash van 32 tekens die veilig is en in dit geval onmogelijk te kraken is.
Een willekeurig wachtwoord maken
Het volgende dat we moeten doen, is om een willekeurig wachtwoord voor ons lid te maken:
$ wachtwoord = rand (1000,5000); // Genereer een willekeurig getal tussen 1000 en 5000 en wijs het toe aan een lokale variabele. // Voorbeelduitvoer: 4568Voeg de volgende informatie in onze database in met behulp van een MySQL-query
mysql_query ("INSERT INTO gebruikers (gebruikersnaam, wachtwoord, e-mail, hash) VALUES ('". mysql_escape_string ($ name). "', '". mysql_escape_string (md5 ($ wachtwoord)).' ',' ". mysql_escape_string ($ email). "','". mysql_escape_string ($ hash). '') ") of sterven (mysql_error ());Zoals je kunt zien, voegen we alle gegevens in met een MySQL-escape-string eromheen om elke MySQL-injectie te voorkomen.
Mogelijk merkt u ook dat de MD5-functie het willekeurige wachtwoord verandert in een veilige hash voor bescherming. Voorbeeld: als een 'kwaad' persoon toegang krijgt tot de database, kan hij de wachtwoorden niet lezen.Vul het formulier in om te testen en controleer of de gegevens in onze database worden ingevoegd.
Stap 5 - Verzend de verificatie-e-mail
Direct nadat we de informatie in onze database hebben ingevoegd, moeten we een e-mail sturen naar de gebruiker met de verificatielink. Dus laten we de PHP "mail" -functie gebruiken om dat te doen.
$ to = $ email; // Stuur e-mail naar onze gebruiker $ subject = 'Signup | Verificatie'; // Geef de e-mail een onderwerp $ message = 'Bedankt voor het aanmelden! Je account is aangemaakt, je kunt inloggen met de volgende inloggegevens nadat je je account hebt geactiveerd door op de onderstaande url te drukken. ------------------------ Gebruikersnaam: '. $ Naam.' Wachtwoord: '. $ Wachtwoord.' ------------------------ Klik op deze link om uw account te activeren: http://www.yourwebsite.com/verify.php?email= ' . $ email. '& hash ='. $ hash. "; // Ons bericht hierboven inclusief de link $ headers = 'From: [email protected]'." \ r \ n "; // Instellen van headers mail ($ tot, $ onderwerp, $ bericht, $ headers); // Stuur onze e-mailLaten we nu de boodschap afremmen:
Bedankt voor het aanmelden! Je account is aangemaakt, je kunt inloggen met de volgende inloggegevens nadat je je account hebt geactiveerd door op de onderstaande url te drukken. ------------------------ Gebruikersnaam: '. $ Naam.' Wachtwoord: '. $ Wachtwoord.' ------------------------In de bovenstaande code sturen we een korte beschrijving naar onze gebruiker die de gebruikersnaam en het wachtwoord bevat - met behulp van de lokale variabelen die we hebben gemaakt toen de gegevens werden gepost.
Klik op deze link om uw account te activeren: http://www.yourwebsite.com/verify.php?email='.$email.'&hash='.$hash. 'In dit gedeelte van de code hebben we een dynamische koppeling gemaakt. Het resultaat hiervan ziet er als volgt uit:
Zoals je ziet, creëert het een solide url, wat onmogelijk te raden is. Dit is een zeer veilige manier om het e-mailadres van een gebruiker te verifiëren.
Stap 6 - Accountactivering
Zoals u kunt zien, is onze url gekoppeld aan verify.php dus laten we dat maken, met behulp van dezelfde basissjabloon die we voor index.php hebben gebruikt.
Verwijder het formulier echter uit de sjabloon.NETTUTS> Aanmelden NETTUTS> Aanmelden
Het eerste wat we moeten doen is controleren of we onze $ _GET-variabelen (e-mail en hash) hebben
if (isset ($ _ GET ['email']) &&! empty ($ _ GET ['email']) EN isset ($ _ GET ['hash']) &&! empty ($ _ GET ['hash'])) / / Verifieer gegevens else // ongeldige benaderingOm het een beetje gemakkelijker te maken, laten we onze lokale variabelen toewijzen en wat MySQL-injectiepreventie toevoegen door nogmaals de MySQL-escape-string te gebruiken.
if (isset ($ _ GET ['email']) &&! empty ($ _ GET ['email']) EN isset ($ _ GET ['hash']) &&! empty ($ _ GET ['hash'])) / / Controleer gegevens $ email = mysql_escape_string ($ _ GET ['email']); // Stel e-mailvariabele in $ hash = mysql_escape_string ($ _ GET ['hash']); // Hash-variabele instellenVervolgens moeten we de gegevens uit de url vergelijken met de gegevens in onze database met behulp van een MySQL-query.
$ search = mysql_query ("SELECT email, hash, active FROM users WHERE. $ email." "AND. $ hash." "AND active =" 0 "" of die (mysql_error ()); $ match = mysql_num_rows ($ search);In de bovenstaande code hebben we een MySQL select-instructie gebruikt en gecontroleerd of de e-mail en hash overeenkwamen. Maar daarnaast hebben we gecontroleerd of de status van het account "inactief" is. Ten slotte gebruiken we mysql_num_rows om te bepalen hoeveel overeenkomsten zijn gevonden. Laten we dit eens proberen. Gebruik eenvoudig een echo om de resultaten te retourneren.
$ search = mysql_query ("SELECT email, hash, active FROM users WHERE. $ email." "AND. $ hash." "AND active =" 0 "" of die (mysql_error ()); $ match = mysql_num_rows ($ search); echo $ match; // Geef weer hoeveel overeenkomsten zijn gevonden -> verwijder dit wanneer u klaar bent met testen;)We hebben een WEDSTRIJD! Om het resultaat te veranderen, verander eenvoudig de e-mail en u zult zien dat het teruggekeerde aantal is 0.
We kunnen onze gebruiken $ match variabele om het account te activeren of om een foutmelding te retourneren als er geen overeenkomst is gevonden.if ($ match> 0) // We hebben een overeenkomst, activeer de account else // Geen overeenkomst -> ongeldige URL of account is al geactiveerd.Om het account te activeren, moeten we het updaten actief veld naar 1 met behulp van een MySQL-query.
// We hebben een overeenkomst, activeren het account mysql_query ("UPDATE gebruikers SET actief =" 1 "WHERE. $ Email." "AND. $ Hash." "AND active =" 0 "") of sterven (mysql_error ()) ; echo 'Uw account is geactiveerd, u kunt nu inloggen';Daarom gebruiken we dezelfde zoektermen voor de update als we gebruikten in onze MySQL-selectiequery. We veranderen actief in 1 waar de e-mail, hash en veld actief = 0 overeenkomen. We sturen ook een bericht waarin de gebruiker wordt verteld dat zijn account is geactiveerd. U kunt een bericht toevoegen zoals we hier hebben gedaan aan het gedeelte 'Geen overeenkomst'. Dus de uiteindelijke code moet er ongeveer zo uitzien:
mysql_connect ("localhost", "tutorial", "password") of die (mysql_error ()); // Maak verbinding met de databaseserver (localhost) met gebruikersnaam en wachtwoord. mysql_select_db ("registrations") of die (mysql_error ()); // Selecteer registratiedatabase. if (isset ($ _ GET ['email']) &&! empty ($ _ GET ['email']) EN isset ($ _ GET ['hash']) &&! empty ($ _ GET ['hash'])) / / Controleer gegevens $ email = mysql_escape_string ($ _ GET ['email']); // Stel e-mailvariabele in $ hash = mysql_escape_string ($ _ GET ['hash']); // Hash-variabele instellen $ search = mysql_query ("SELECT email, hash, active FROM users WHERE. $ Email." "AND. $ Hash." "AND active =" 0 "") of die (mysql_error ()); $ match = mysql_num_rows ($ search); if ($ match> 0) // We hebben een match, activeer het account mysql_query ("UPDATE gebruikers SET active =" 1 "WHERE. $ email." "AND. $ hash." "AND active =" 0 "" ) of sterven (mysql_error ()); echo 'Uw account is geactiveerd, u kunt nu inloggen'; else // Geen overeenkomst -> ongeldige URL of account is al geactiveerd. echo 'De URL is ongeldig of u heeft uw account al geactiveerd.'; else // Ongeldige aanpaksecho 'Ongeldige aanpak, gebruik alstublieft de link die naar uw e-mail is gestuurd.';Als je bezoekt verify.php zonder enige tekenreeks wordt de volgende fout weergegeven:
Stap 7 - Inloggen
In deze laatste stap zal ik u laten zien hoe u een basisaanmeldingsformulier kunt maken en kunt controleren of het account is geactiveerd. Maak eerst een nieuw bestand met de naam login.php met de basissjabloon die we eerder hebben gebruikt, maar deze keer heb ik het formulier veranderd in een inlogformulier.
NETTUTS> Aanmelden NETTUTS> Aanmelden
'; // Toon ons bericht en voeg er een div om toe met de class statusmsg?>login formulier
Voer uw naam en wachtwoord in om in te loggen
'$ Msg.'
Het formulier is standaard html en bijna hetzelfde als het aanmeldingsformulier, er is geen verdere uitleg nodig. Nu is het tijd om de code voor het login-script te schrijven, die we net onder de MySQL-verbindingscode zullen schrijven. We beginnen met iets dat we ook in het aanmeldingsformulier hebben gedaan.
if (isset ($ _ POST ['name']) &&! empty ($ _ POST ['name']) EN isset ($ _ POST ['password']) &&! empty ($ _ POST ['password'])) / / Beide velden worden geplaatst en zijn niet leeg
We controleren dus eerst of de gegevens worden gepost en we zorgen ervoor dat deze niet leeg is.
De volgende is om enkele lokale variabelen voor de postgegevens te maken:
if (isset ($ _ POST ['name']) &&! empty ($ _ POST ['name']) EN isset ($ _ POST ['password']) &&! empty ($ _ POST ['password'])) $ gebruikersnaam = mysql_escape_string ($ _ POST ['name']); // Stel variabele in voor de gebruikersnaam $ wachtwoord = mysql_escape_string (md5 ($ _ POST ['wachtwoord'])); // Stel variabele in voor het wachtwoord en converteer het naar een MD5-hash.
We hebben de lokale variabelen gemaakt en het wachtwoord veranderd in een md5-hash om het aan te passen aan de wachtwoordhash die we in de database hebben opgeslagen.
Nu is het tijd om de verbinding met onze "gebruikers" -tabel te maken en te controleren of de ingevoerde gegevens correct zijn.
if (isset ($ _ POST ['name']) &&! empty ($ _ POST ['name']) EN isset ($ _ POST ['password']) &&! empty ($ _ POST ['password'])) $ gebruikersnaam = mysql_escape_string ($ _ POST ['name']); $ wachtwoord = mysql_escape_string (md5 ($ _ POST ['wachtwoord'])); $ search = mysql_query ("SELECTEER gebruikersnaam, wachtwoord, actieve FROM gebruikers WHERE. $ gebruikersnaam." "AND. $ wachtwoord." "AND active =" 1 "") of sterf (mysql_error ()); $ match = mysql_num_rows ($ search);
We hebben een MySQL-query geschreven die de gebruikersnaam, het wachtwoord en actieve informatie uit onze database selecteert, als de gebruikersnaam en het wachtwoord overeenkomen.
AND active = "1" BELANGRIJK!, dit zorgt ervoor dat u alleen kunt inloggen als uw account is geactiveerd. We gebruiken de MySQL num-rijen opnieuw om te zien hoeveel overeenkomsten zijn gevonden.
if ($ match> 0) $ msg = 'Aanmelden voltooid! Bedankt'; // Cookie instellen / sessie starten / Download starten etc ... else $ msg = 'Aanmelden mislukt! Zorg ervoor dat u de juiste gegevens invoert en dat u uw account hebt geactiveerd. ';
In de bovenstaande code controleren we of de login succesvol was of niet.
En dat is het einde van deze tutorial! Ik hoop dat je het leuk vond, en als je dat deed, laat dan een reactie hieronder achter!