Hur man bygger ett fullständigt inloggningssystem

I denna handledning kommer jag att visa dig hur man gör ett enkelt inloggningssystem som består av en inloggningssida, registreringssida, glömt lösenordssida, e-postaktivering, logoutsida och slutligen en användares webbsida. Jag gjorde denna handledning till att främst rikta sig mot nya utvecklare på grund av det faktum att jag började märka bristen på grundläggande inloggningssystem. Därför bestämde jag mig för att göra en själv som ger högkvalitativ rådgivning om hur du gör ditt första inloggningssystem med ett användares online-skript!


1. Gör ett grundläggande formatblad

Vi kommer att skapa ett mycket grundläggande CSS-stilark för att bara lägga till lite design och städa upp hur det här inloggningssystemet ser ut. Så också börja med att öppna din textredigerare och vi kan börja göra vårt styelsheet.

kropp font-family: arial; typsnittstorlek: 10pt;  tabell font-size: 10pt; marginal: 0 auto;  #border border: 2px solid # 999; bakgrund: #CCC; vaddering: 15px; marginal: 0 auto; bredd: 300px; 

Spara den här filen som style.css så vi kan länka tillbaka till det när vi behöver. Där har vi vårt enkla stilark! Nu kan vi börja göra våra sidor utan att oroa dig för mycket om att de ser rimligt bra ut.



2. Skapa inloggningssidan

Okej så vi har definierat ett stilark, nu är det dags att få saker att visa på våra sidor. Öppna en ny fil i din textredigerare, det här blir vår login.php sida!

  
Användarnamn:
Lösenord:
Registrera | Glömt Pass

Okej, det här är vad vårt login.php filen kommer att se ut innan vi får vår PHP så att inloggningsformuläret fungerar korrekt. För tillfället märker du att det inte fungerar. Detta beror på att vi inte har berättat på sidan vad som ska göras om formuläret lämnas in.

Planera

Nu ska vi göra lite planering innan vi dyker in i PHP. Vi måste fråga oss "Vad ska sidan kolla när formuläret skickas in?". För inloggningssidan här är en lista över vad vi ska checka -

  • Att både användarnamnet och lösenordet har fyllts i
  • Att användarnamnet levereras finns i vår databas
  • Att om användarnamnet finns i vår databas, matchar lösenordet det med användarnamnet
  • Slutligen, att användaren har aktiverat sitt konto

Om PHP kan svara ja till alla fyra punkterna loggar du in användaren. Nu i de fyra punkterna märker du att det var en databas som nämns. Vi ska använda en MySQL-databas för att lagra all information om var och en av våra användare. Så innan vi börjar om på PHP måste vi göra denna databas. Vid denna tidpunkt behövs lite mer planering. Vi måste bestämma vilken information vi behöver lagra om användarna, vilka typer av data lagras vi, behöver vi ett standardvärde etc etc. Här är min plan nedan -

  • Vi måste lagra ett användarnamn för användaren som kommer att vara en varchar
  • Vi behöver ett lösenord som också kommer att vara en varchar
  • Vi kommer att behöva ett mail för vår e-post aktiveringsfunktion det kan vara varchar också
  • Ett fältpresentation är om kontot har aktiverats eller inte, det här är ett heltal
  • Ett fält som ger information om huruvida användaren är online eller inte, detta blir ett heltal
  • Slutligen, ett fält som ger oss en tid som användaren registrerade, är också ett heltal

Bygga databasen

Nu kan vi se exakt hur vi bygger vårt bord i vår databas. Skapa först en databas som heter loginTut. Sedan i den här databasen vill vi köra SQL som jag har angivit nedan -

Notera: Alla tabeller innehåller en primär nyckel. Detta är en unik identifierare för varje rad i tabellen!

CREATE TABLE IF NOT EXISTS 'användare' ('id' int (11) INTE NULL auto_increment, 'användarnamn' varchar (32) INTE NULL, "lösenord" varchar (32) INTE NULL, "online" int '0', 'email' varchar (100) INTE NULL, 'aktiv' int (1) INTE NULL standard '0', 'rtime' int (20) INTE NULL standard '0', PRIMÄR KEY ('id')) ENGINE = MyISAM DEFAULT CHARSET = utf8;

Nu har vi ett bord för att lagra all information vi behöver om våra användare, låt oss lägga till en användare för teständamål. För att göra detta kör SQL som anges nedan -

INSERT INTO 'användare' ('id', 'användarnamn', 'lösenord', 'online', 'email', 'aktiv', 'rtime') VÄRDEN (1, "testning", "testning", 0, "falsk @ noemail.co.uk ', 0, 0);

Så vi har nu en användare med användarnamnet testning, lösenordet testning och e-post [email protected]. Nu kan vi komma till PHP och göra inloggningsformulär!

Lägga till PHP

Först måste vi först tänka på säkerhet och hur säkert är det här inloggningsformuläret. För att förhindra SQL-injektion som är en mycket vanlig form av databashackning kommer vi att göra en funktion som skyddar alla strängar som lagras i databasen. Detta lägger vi in ​​en extern fil som heter functions.php. Här är källan -

 

Denna funktion kommer att trimma vår sträng (klippa bort vilket vitt utrymme som helst i början eller slutet av strängen), ta bort taggar (ta bort alla HTML och PHP-taggar i strängen) och lägg sedan till snedstreck i strängavvikande talmärken (') och citattecken (").

Tillbaka till login.php

Nu har vi en plats att lagra och kontrollera användarinformation från, en funktion för att skydda strängar som skickas till databasen, och en snygg layout för vår inloggningssida! Nedan kan du se kommenterad kod för vår login.php filen med den nyligen tillagda PHP-

  Du måste fylla i en Användarnamn och a Lösenord!"; else // om de fortsatte kontrollen // välj alla rader från tabellen där användarnamnet matchar det som användaren har angett $ res = mysql_query (" SELECT * FROM "users 'WHERE' användarnamn '='". $ användarnamn. "'"); $ num = mysql_num_rows ($ res); // kontrollera om det inte fanns en match om ($ num == 0) // om inte visa ett felmeddelande echo "
De Användarnamn du levererade existerar inte!
"; annars // om det var en match fortsätter kontrollen // välj alla rader där användarnamnet och lösenordet matchar de som skickats av användaren $ res = mysql_query (" SELECT * FROM "users 'WHERE' användarnamn '='" $ $ användarnamn. "'OCH' lösenord '='" $ lösenord. "'"; $ num = mysql_num_rows ($ res); // kontrollera om det inte fanns en match om ($ num == 0) / / om inte visa felmeddelande echo "
De Lösenord du levererade matchar inte den för det användarnamnet!
"; else // om det fortsatte kontrollen // dela alla fält i rätt rad till en associativ array $ row = mysql_fetch_assoc ($ res); // kontrollera om användaren inte har aktiverat sitt konto än om ( $ row ['active']! = 1) // om inte visa felmeddelande echo "
Du har inte än aktiverad ditt konto!
"; annars // om de har loggat in // // inloggningssessionen lagrar det id - vi använder det här för att se om de är inloggade eller inte $ _SESSION ['uid'] = $ row ['id'] ; // visa meddelande echo "
Din inloggning lyckades!
"; // uppdatera online-fältet till 50 sekunder in i framtiden $ time = date ('U') + 50; mysql_query (" UPDATE "användares SET 'online' = '". $ time. = '". $ _ SESSION [' uid ']."' "); // omdirigera dem till sidans sidhuvud för usersonlinjen (" Plats: usersOnline.php ");?
Användarnamn:
Lösenord:
Registrera | Glömt Pass

Det mesta av detta förklaras av kommentaren, men en del som jag inte förklarade är onlinefältet. När du loggat in, uppdaterade vi onlinefältet till 50 sekunder före nu. Datum-funktionen ("U") ger oss en mängd sekunder sedan 1 januari 1970 00:00:00 GMT (Unix epoch). Det betyder att datumet ('U') aldrig kommer att bli mindre, värdet kommer alltid att öka. Om vi ​​ställer in nätfältet till 50 sekunder före nu då när Användare Online sidan laddas kan vi kolla för att hitta alla användare där onlinevärdet är mer än den tid då sidan laddas, om så är fallet visa sedan var och en av namnen.

Nu är du välkommen att testa din inloggningssida. Se till att alla kontroller utförs på rätt sätt och att när du är inloggad, omdirigeras du till den icke-existerande användarens webbsida. Du kan också kontrollera om den har uppdaterat fältet online genom att kolla ditt användartabell!



3. Skapa registreringssidan

Vilken bra är en inloggningssida utan en registersida? Inte alls alls så jag tror att det blir nästa steg för oss att ta. Att skapa registersidan kommer att likna att skapa vår inloggningssida. Vi behöver göra några grundläggande kontroller för att se om användarnamnet önskas redan är taget, men det sker inget nytt där. Nedan kan du se den kommenterade registerkoden -

  Du måste fylla i alla obligatoriska fildar! "; Annars // om alla fylldes in fortsätter du kontrollera // Kontrollera om det önskade användarnamnet är mer än 32 eller mindre än 3 karaktärer långt om (strlen ($ användarnamn)> 32 || strlen ($ användarnamn) < 3) //if it is display error message echo "
Din Användarnamn måste vara mellan 3 och 32 tecken långa!
"; else // om inte fortsätta kontrollera // välj alla rader från utanvändardata där det upplagda användarnamnet matchar användarnamnet som lagrats $ res = mysql_query (" VÄLJ * FRÅN "användare" WHERE "användarnamn" = "". användarnamn. "'"); $ num = mysql_num_rows ($ res); // kolla om det är en match om ($ num == 1) // om ja användarnamnet är taget så visa felmeddelande echo "
De Användarnamn du har valt är redan tagit!
"; annars // fortsätt med att kontrollera // kontrollera om lösenordet är mindre än 5 eller mer än 32 tecken långt om (strlen ($ lösenord) < 5 || strlen($password) > 32) // om det visar felmeddelande echo "
Din Lösenord måste vara mellan 5 och 32 tecken långa!
"; else // fortsätt kontrollera // kolla om lösenordet och bekräfta lösenordet matchar om ($ password! = $ passconf) // om inte visa felmeddelande echo"
De Lösenord du levererade matchade inte bekräftelseslösenordet!
"; else // fortsätt med att kontrollera // Ange det format vi vill kolla in e-postadressen mot $ checkemail =" /^[a-z0-9]+([_\\.-][a-z0- 9] +) * ([a-z0-9] + ([\ .-] [a-z0-9] +) *) + \\ [az] 2 / i "; // kontrollera om formatet matchar om (! preg_match ($ checkemail, $ email)) // om inte visa felmeddelande echo "
De E-post är inte giltig, måste vara [email protected]!
"; annars // om de gör det, fortsätt att kontrollera // välj alla rader från våra användartabeller där e-postmeddelandena matchar $ res1 = mysql_query (" SELECT * FROM "users 'WHERE' email '='". $ email. " $ $ $ 1, $ num1 = mysql_num_rows ($ res1); // om antalet matchningar är 1 om ($ num1 == 1) // den angivna e-postadressen är taget så visas felmeddelande echo "
De E-post Den adress du har fått är redan tagit
"; else // äntligen, annars registrera det konto // registrerings tid (unix) $ registerTime = datum ('U'); // Skapa en kod för vår aktiveringsnyckel $ code = md5 ($ användarnamn). $ registerTime; // infoga raden i databasen $ res2 = mysql_query ("INSERT INTO" användare "(" användarnamn "," lösenord "," email "," rtime ") VALUES ('". $ användarnamn. "' ". $ lösenord." ',' ". $ email." ',' ". $ registerTime." ') "; // skicka e-postmeddelandet med ett e-postmeddelande som innehåller aktiveringslänken till det medföljande e- postadressmeddelandet , $ INFO ['chatName']. "Registreringsbekräftelse", "Tack för att du registrerade dig". $ Användarnamn. ", \ N \ nHär är din aktiveringslänk. Om länken inte fungerar kopieras och klistras in i din webbläsarens adressfält. \ n \ nhttp: //www.yourwebsitehere.co.uk/activate.php? code = ". $ code, 'Från: [email protected]'); // visa succulationsmeddelandet eko "
Du har registrerat dig, besök din inkorg för att aktivera ditt konto!
";?>
Användarnamn:
Lösenord:
Bekräfta lösenord:
E-post:
Logga in | Glömt Pass

Nya funktioner

Den här filen innehåller några nya saker du kanske inte känner till, därför går jag över allt. För det första returnerar funktionen strlen () det antal tecken i en sträng som gör att vi kan kontrollera hur långa strängar är. Därefter kontrollerar funktionen preg_match (), om formateringen av en sträng matchar den formatering du anger (i det här fallet ett e-postformat). Slutligen skickar posten () -funktionen ett e-postmeddelande från servern till valfritt e-postmeddelande som innehåller allt du vill ha. Du ska spara den här filen som register.php

Nu kan du testa dig att registrera sida, du kan se när du anger din korrekta e-postadress, så får du ett mail med en aktiveringslänk som finns inuti. Du kan också se att en rad som innehåller data fylld i formuläret är in i användartabellen. Värdet av aktivt är 0 visar att det här kontot ännu inte har aktiverats!



4. Aktivera kontotsidan

Detta är bara en liten sida med mycket liten kod krävs, men det är fortfarande mycket viktigt och spelar en stor roll i ett säkert inloggningssystem. Källan för denna sida visas nedan - activate.php

  Olyckligtvis fanns det ett fel! "; Annars / / andra sätt fortsätter kontrollen // välj alla rader där kontona inte är aktiv $ res = mysql_query (" VÄLJ * FRÅN "användare" VAR "aktiv" = "0 // loop genom det här skriptet för varje rad hittades inte aktivt medan ($ row = mysql_fetch_assoc ($ res)) // kolla om koden från raden i databasen matchar den som användaren har om ($ kod == md5 ($ row ['användarnamn']). $ row ['rtime']) // om det då aktiverar det konto och visa framgångsmeddelande $ res1 = mysql_query ("UPDATE" '1' VAR 'id' = '". $ Rad [' id ']."' "); Echo"
Du har aktiverat ditt konto!
";?>

Det finns två nya saker i den här filen, vi använder GET-metoden i stället för POST och även vi använder en stund () -lopp. Få-metoden får helt enkelt data från adressfältet högst upp i användarens webbläsare (i det här fallet är koden som skickas med e-post till deras e-postadress). Längstiden () är perfekt för kontroll genom flera rader av data valda från databasen (i det här fallet för att se om det finns en matchning med koderna).

Översikt så långt

Hittills borde du ha lärt dig många nya saker om ditt nya till PHP och framgångsrikt skapat en halv av ett inloggningssystem. Sidorna som fyllts i hittills är -

  • style.css
  • functions.php
  • login.php
  • register.php
  • activate.php

Några användbara funktioner som hittills används är -

  • mysql_connect () - Anslut till en mysql-databas
  • mysql_select_db () - Välj den databas som vi ska arbeta med
  • mysql_query () - Skicka querys till databasen för att få, infoga eller redigera data
  • trim () - Klipp oönskat vitt utrymme i början och slutet av en sträng
  • strip_tags () - Ta bort HTML och PHP-taggar från en sträng
  • addslashes () - Lägg till snedstreck i strängen så att citat och talmärken kan användas säkert
  • strlen () - Få antalet tecken i en sträng
  • preg_match () - Preg match är att matcha formateringen av en sträng
  • post () - Skicka mail från servern till den angivna e-postadressen
  • md5 () - Detta beräknar md5-hash för en sträng


5. Glömt ditt lösenord?

Nästa upp är vår glömda lösenordssida. Om användaren glömmer sitt lösenord kan vi maila det till dem nu vet vi att de gav en riktig e-postadress på grund av aktiveringen. Så utan vidare ado är den kommenterade koden för forgot.php -

  Du måste fylla i din E-post adress! "; else // fortsätt kontrollera // sätt formatet för att kontrollera e-posten mot $ checkemail =" /^[a-z0-9]+([_\\.-][a-z0-9 ] +) * @ ([a-z0-9] + ([\ .-] [a-z0-9] +) *) + \\. [az] 2 / / " om e-postmeddelandet inte matchar det önskade formatet om (! preg_match ($ checkemail, $ email)) // om inte då visa felmeddelande echo "
E-post är inte giltig, måste vara [email protected]!
"; else // fortsätt med att kontrollera // välj alla rader från databasen där e-postmeddelandena matchar $ res = mysql_query (" VÄLJ * FRÅN "användare" WHERE 'email' = '". $ email."' "); $ num = mysql_num_rows ($ res); // kolla om antalet rader matchade är lika med 0 om ($ num == 0) // om det visar felmeddelande echo "
De E-post du levererade finns inte i vår databas!
"; annars // annars fullständigt glömt pass-funktionen // dela raden i en associativ array $ row = mysql_fetch_assoc ($ res); // skicka e-post med deras lösenord till deras e-postadress ($ email, 'Forgotten Password' , "Här är ditt lösenord:". $ Rad ['lösenord']. "\ N \ nPröm inte att förlora det igen!", "Från: [email protected]"); "
Ett e-postmeddelande har skickats med din e-postadress med ditt lösenord!
";?>
E-post:
Registrera | Logga in

Den här sidan består av inget nytt, därför spenderar jag mindre tid på att titta över den. En sak som jag vill nämna är att om du inte har lagt märke till att vi har inkluderat vår css-fil på varje sida, håller den layout vi använder för varje sida mycket likhet och håller en fin smart design över hela webbplatsen.

Nästa och sista sidan vi kommer att göra i denna handledning kommer att vara lite annorlunda. Denna sida har kontrollen för att se om användaren är inloggad eller inte, och i det här fallet visas alla användare online vid det aktuella ögonblicket (eller att vara exakt inom de senaste 50 sekunderna).



6. Användarnas webbsida

Okej så vi har gjort det till den del av webbplatsen som du behöver vara inloggad för att kunna se. Som jag nämnde tidigare kommer den här att vara något annorlunda än de andra på grund av det faktum att vi måste kontrollera om användaren är inloggad eller inte. Om de inte är inloggade och försöker se sidan har vi några alternativ vi kan göra. Det första vi kan visa ett felmeddelande säger något i linje med "Du måste vara inloggad för att se den här sidan!", Eller vi kan omdirigera dem tillbaka till inloggningssidan. För denna handledning tror jag att jag ska använda felmeddelandemetoden.

Så här är det usersOnline.php sidans källa -

  Du måste vara inloggad för att använda den här funktionen! "; Else // fortsätt sidan // detta är ut uppdateringsskript som ska användas på varje sida för att uppdatera användarnas online tid $ time = date ('U' ) +50; $ update = mysql_query ("UPDATE" användarnas SET 'online' = '". $ Time." "VAR" id "=" ". $ _ SESSION [' uid ']. 
Användare Online: '' .date ('U'). "'"); // loop för varje rad medan ($ row = mysql_fetch_assoc ($ res)) // echo varje användarnamn som visat sig vara online med ett streck för att dela upp dem echo $ rad [ 'användarnamn']." - ";?>
Logga ut

Som jag nämnde kan du se att denna sida är lite annorlunda. Vi kontrollerar inte bara att de är inloggade, men vi uppdaterar online-tid som håller onlinefältet före den aktuella tiden. Varje gång en sida laddas med det skriptet, uppdateras det för att sätta dem på nätet. Nu har vi en enda sista sida att göra och då är vi färdiga. När en användare har loggat in måste han kunna logga ut!



Logout.php

Detta måste anses vara den enklaste sidan att göra som jag är säker på att de flesta av er glada att höra. Nu är den kommenterade koden för logout.php fil -

  Du måste vara inloggad för att logga ut! "; Else // om det fortsätter att kontrollera // uppdatera för att ställa in den här användarens onlinefält till den aktuella tiden mysql_query (" UPDATE "users 'SET' online '='". datum ('U'). '' VAR '' ''. '. $ _ SESSION [' uid '].' '"; // förstör alla sessioner som avbryter inloggningssessionen session_destroy (); // visa framgångsmeddelande echo"
Du har blivit utloggad!
";?>

Jag tycker att kommentarerna i den här filen förklarar det nog, och jag tror att din PHP-kunskap nu borde vara mycket högre och du borde kunna förstå det mesta av det här nu.