Hoe maak ik een loginsysteem met php en mysql dat meerdere leden ondersteunt?

Trefwoorden: PHP, cookies, session, MySQL, login systeem, leden, authenticatie
In dit artikel zal ik uitleggen hoe je een simpel login systeem maakt waarmee je een virtueel oneindig aantal gebruikers kan toelaten. Er zit ook een functie bij die je toelaat een cookie te plaatsen om zo ingelogd te blijven. In het script wordt gebruik gemaakt van een class zodat je de code eenvoudig kan hergebruiken. Eventueel kan je het gebruik van classes nog verder doortrekken in de code, is een beetje een persoonlijke keuze.

Alle bestanden die we aanmaken, zullen we in één en dezelfde map plaatsen. Als je zelf het script gaat aanpassen of gaat implementeren in een grotere website, is het aan te raden om de include file(s) en classe(s) in een aparte map te steken om zo het overzicht te bewaren. ;-)

Eerst en vooral moeten we de tabel opbouwen, je kan dit eenvoudig doen door onderstaande code uit te voeren als een SQL query.

CODE
  1. CREATE TABLE leden (
  2. id INT NOT NULL AUTO_INCREMENT ,
  3. gebruikersnaam VARCHAR( 100 ) NOT NULL ,
  4. wachtwoord VARCHAR( 100 ) NOT NULL ,
  5. voornaam VARCHAR( 100 ) NOT NULL ,
  6. achternaam VARCHAR( 100 ) NOT NULL ,
  7. emailadres VARCHAR( 255 ) NOT NULL ,
  8. registratiedatum VARCHAR( 20 ) NOT NULL ,
  9. PRIMARY KEY ( id )
  10. );


De huidige tabel bestaat uit 7 velden, zoals je zelf kan zien. Natuurlijk kan je er zelf nog een aantal toevoegen(of verwijderen) naar jouw noden.

Nu gaan we alles instellen om verbinding te maken met onze database. Sla onderstaande code op in een bestand config.inc.php.

PHP
  1. <?php
  2.  
  3.  
  4. // Hier kan je een tekst opgeven die je tabellen vooraf gaat.
  5. // Hierdoor kan je meerdere loginsystemen gebruiken in 1 database,
  6. // zonder de code te moeten aanpassen. Bijvoorbeeld MD_
  7. $db_prefix = "";
  8. // Je host, meestal localhost, mysql of mysqlhost
  9. $mysql_host = "";
  10. // Gebruikersnaam om toegang te krijgen tot je database
  11. $mysql_user = "";
  12. // ... en bijhorend wachtwoord
  13. $mysql_pwd = "";
  14. // last but not least: je tabel
  15. $mysql_db = "";
  16.  
  17. @$database = mysql_connect($mysql_host,$mysql_user,$mysql_pwd) or die(mysql_error());
  18. @mysql_select_db($mysql_db,$database);
  19.  
  20. ?>


Nu we alles ingesteld hebben, kunnen we beginnen met het echte werk. Maak een file login.class.php aan en plaats daarin de volgende code:

PHP
  1. <?php
  2.  
  3. class user {
  4.  
  5.        
  6.  
  7. }
  8.  
  9. ?>
  10.  


We hebben nu een class user aangemaakt zodat we later alles kunnen aanroepen door een object user aan te spreken. Onze klasse is evenwel niets zonder functies, dus gaan we eerst zorgen dat we functies nodig hebben.

Creëer een nieuw bestand dat je registreren.php noemt. Deze file zal vooral html code bevatten.

PHP
  1. <?php
  2.  
  3. // Configuratiebestand beschikbaar maken zodat we toegang hebben tot onze database
  4. require_once "config.inc.php";
  5. // User klasse beschikbaar stellen
  6. require_once "login.class.php";
  7.  
  8. ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  9. <html>
  10. <head>
  11. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  12. <title>Registreren - www.multidesk.be</title>
  13. </head>
  14. <body>
  15. <?php
  16.  
  17. // Nakijken of het forumier submit is
  18. if ($_POST['registreren']) {
  19.  
  20.         // We maken een nieuw object aan...
  21.  $user = new user;
  22.  // ... en laten de ingevulde gegevens parsen.
  23.  $user ->registreren();
  24.  
  25.  // Het formulier is nog niet submit, dus tonen we de velden.
  26. } else {
  27.  
  28. ?>
  29.  
  30. <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
  31. <table>
  32.         <tr>
  33.                 <td>Gebruikersnaam*:</td>
  34.                 <td><input type="text" name="gebruikersnaam" size="20" /></td>
  35.         </tr>
  36.         <tr>
  37.                 <td>Wachtwoord*:</td>
  38.                 <td><input type="password" name="wachtwoord1" size="20" /></td>
  39.         </tr>
  40.         <tr>
  41.                 <td>Wachtwoord*:<br /><small>(Bevestigen)</small></td>
  42.                 <td><input type="password" name="wachtwoord2" size="20" /></td>
  43.         </tr>
  44.         <tr>
  45.                 <td>Voornaam:</td>
  46.                 <td><input type="text" name="voornaam" size="20" /></td>
  47.         </tr>
  48.         <tr>
  49.                 <td>Achternaam:</td>
  50.                 <td><input type="text" name="achternaam" size="20" /></td>
  51.         </tr>
  52.         <tr>
  53.                 <td>E-mailadres:</td>
  54.                 <td><input type="text" name="emailadres" size="20" /></td>
  55.         </tr>
  56.         <tr>
  57.                 <td colspan="2">Velden met een * zijn verplicht in te vullen.</td>
  58.         </tr>
  59.         <tr>
  60.                 <td>&nbsp;</td>
  61.                 <td><input type="submit" value="Registreren" name="registreren" />
  62. </td>
  63.         </tr>
  64. </table>
  65. <?php
  66.  
  67. }
  68.  
  69. ?>
  70. </body>
  71. </html>
  72.  


Deze file vraagt niet zo veel uitleg, in grote lijnen komt het hierop neer: We plaatsen een formulier in de code, kijken na of dit formulier ingevuld is. Als dit ingevuld is, valideren we de gegevens, zoniet tonen we het formulier. Als je het script gaat uitbreiden, kan je hier nog extra velden toevoegen, vergeet ook niet de code in de klasse(die we zo meteen gaan aanmaken) aan te passen ;-)

Om de ingevulde gegevens te controleren en, als alles goed is ingevuld, weg te schrijven naar de database gaan we dus gebruik maken van een klasse. Maak in je klasse user een nieuwe functie registreren() aan. Daarin gaan we de code plaatsen. Het eindresultaat zou er zo moeten uitzien:

PHP
  1. <?php
  2.  
  3. class user {
  4.  
  5.         function registreren() {
  6.  
  7.                 // Zorgen dat we het voorvoegsel, dat we in onze config file hebben ingesteld, kunnen gebruiken
  8.                 global $db_prefix;
  9.  
  10.                 // Nakijken of alle velden ingevuld werden
  11.                 // Je kan hier zelf nog zoveel velden toevoegen als je wil.
  12.                 // Als voorbeeld zullen enkel de velden gebruikersnaam en wachtwoord ingevuld moeten zijn.
  13.                
  14.                 // Nakijken of alle velden ingevuld zijn...
  15.                 // We hoeven niet na te kijken of wachtwoord2 ook ingevuld is, omdat we zo meteen de
  16.                 // 2 wachtwoorden gaan vergelijken met elkaar.
  17.                 if (strlen(trim($_POST['gebruikersnaam'])) == 0 || strlen(trim($_POST['wachtwoord1'])) == 0) $error = "Gelieve alle verplichte velden in te vullen<br />";
  18.                 // De twee ingevulde wachtwoorden vergelijken
  19.                 if ($_POST['wachtwoord1'] != $_POST['wachtwoord2']) $error = "Gelieve twee keer hetzelfde wachtwoord in te vullen<br />";
  20.                 // Elke gebruikersnaam mag maar één keer voorkomen in de database, dus gaan we dit ook controleren
  21.                 if (mysql_result(mysql_query("SELECT COUNT(*) FROM ".$db_prefix."leden WHERE gebruikersnaam='".$_POST['gebruikersnaam']."'"),0) != 0) $error = "Gelieve een andere gebruikersnaam te kiezen";
  22.                
  23.                
  24.                 // Fout opgetreden?
  25.                 if ($error) {
  26.                
  27.                         echo $error;
  28.                         return false;
  29.                        
  30.                 } else {
  31.                
  32.                         // Alle ingevulde data wegschrijven naar de database
  33.                         mysql_query("INSERT INTO ".$db_prefix."leden  (
  34.                         gebruikersnaam,
  35.                         wachtwoord,
  36.                         voornaam,
  37.                         achternaam,
  38.                         emailadres,
  39.                         registratiedatum
  40.                         ) VALUES (
  41.                         '".$_POST['gebruikersnaam']."',
  42.                         MD5('".$_POST['wachtwoord1']."'),
  43.                         '".addslashes(htmlspecialchars($_POST['voornaam']))."' ,
  44.                         '".addslashes(htmlspecialchars($_POST['achternaam']))."' ,
  45.                         '".addslashes(htmlspecialchars($_POST['emailadres']))."' ,
  46.                         '".time()."'
  47.                         )");
  48.                                        
  49.                         // Sessie bijwerkken
  50.                         $_SESSION['gebruikersnaam'] = $_POST['gebruikersnaam'];
  51.                         $_SESSION['uid'] = mysql_insert_id();
  52.                                
  53.                         // ... en de bezoeker op de hoogte brengen dat alles goed is verlopen
  54.                         echo 'Beste '.$_POST['gebruikersnaam'].', <br /><br />
  55.                         Je werd met succes geregistreerd. We hebben je eveens al ingelogd.<br /><br />
  56.                         De crew';
  57.                        
  58.                 }
  59.                
  60.         }
  61.  
  62. }
  63.  
  64. ?>


De uitleg kan je weer in de code vinden. Zoals reeds gezegd, als je extra velden wil toevoegen (bijvoorbeeld woonplaats), moet je ook hier code aanpassen. Het gaat dan om de SQL Query. Om terug te komen op het voorbeeld van de woonplaats, zal ik dit even uitwerken:
PHP
  1.        
  2. <?php
  3.  
  4.                 mysql_query("INSERT INTO ".$db_prefix."leden  (
  5.                         gebruikersnaam,
  6.                         wachtwoord,
  7.                         voornaam,
  8.                         achternaam,
  9.                         emailadres,
  10.                         registratiedatum,
  11.                         woonplaats
  12.                         ) VALUES (
  13.                         '".$_POST['gebruikersnaam']."',
  14.                         MD5('".$_POST['wachtwoord1']."'),
  15.                         '".addslashes(htmlspecialchars($_POST['naam']))."',
  16.                         '".addslashes(htmlspecialchars($_POST['achternaam']))."',
  17.                         '".addslashes(htmlspecialchars($_POST['emailadres']))."',
  18.                         '".time()."',
  19.                         '".addslashes(htmlspecialchars($_POST['woonplaats']))."'
  20.                         )");
  21.  
  22. ?>


Vergeet dus niet het veld woonplaats ook te voegen aan het formulier op de registratiepagina, anders ga je niet veel resultaat zien ;)

Ok, leuk, registreren gaat al. Nu gaan we de code maken om na de registratie ook nog te kunnen inloggen. Ook hier, grotendeels HTML, de eigenlijke PHP code gaat weer in de class terecht komen ;)

PHP
  1. <?php
  2.  
  3. // Configuratiebestand beschikbaar maken zodat we toegang hebben tot onze database
  4. require_once "config.inc.php";
  5. // User klasse beschikbaar stellen
  6. require_once "login.class.php";
  7.  
  8. // Nakijken of het formulier submit is
  9. if ($_POST['inloggen']) {
  10.  
  11.         // We maken een nieuw object aan...
  12.  $user = new user;
  13.  // ... en kijken na of de ingevulde gegevens kloppen
  14.  $user ->inloggen();
  15.  
  16. }
  17.  
  18. ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  19. <html>
  20. <head>
  21. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  22. <title>Login - www.multidesk.be</title>
  23. </head>
  24. <body>
  25.  
  26. <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
  27. Gebruikersnaam: <input type="text" name="gebruikersnaam" size="10" /><br />
  28. Wachtwoord: <input type="password" name="wachtwoord" size="10" /><br />
  29. Remember me:<input type="checkbox" checked="checked" name="automatischinloggen" /><br />
  30. <input type="submit" value="Inloggen" name="inloggen" />
  31. </form>
  32. <a href="registreren.php">Registreren</a>
  33.  
  34. </body>
  35. </html>


Ook hier weer niet veel nieuws onder de zon, in eerste instantie een standaard HTML-pagina, die je index.php kan noemen, met een formulier op voor je gegevens in te vullen. Eerst kijken we dus na of het formulier gepost is, is dit het geval dan kijken we de gegevens na, anders tonen we het formulier. Ik heb onder het formulier eveneens een link geplaatst naar onze registratiepagina ;)

Nu gaan we de klasse verder aanvullen, voeg de functie inloggen() gewoon toe onder de vorige (verwijder wel de php-tags in dit stuk code, deze staan er enkel om de code hier overzichtelijk te kunnen tonen):

PHP
  1. <?php
  2.  
  3.         function inloggen() {
  4.        
  5.                 // Onze bezoeker is reeds ingelogd
  6.                 if ($_SESSION) echo "Je bent reeds ingelogd";
  7.                 else {
  8.                
  9.                         // Nakijken of er overal wel iets werd ingevuld.
  10.                         if (strlen($_POST['gebruikersnaam']) == 0) $error .= 'Gelieve een gebruikersnaam in te vullen.<br />';
  11.                         if (strlen($_POST['wachtwoord']) == 0) $error .= 'Gelieve een wachtwoord in te vullen.';
  12.                
  13.                         // Werd er zonet een fout gevonden?
  14.                         if ($error) {
  15.                        
  16.                                 // ... dan tonen we ze
  17.                                 echo '<div style="font-weight:bold; color:#cc0000;">'.$error.'</div>';
  18.  
  19.                         // ... anders gaan we verder met de rest van de controles
  20.                         } else {
  21.  
  22.                                
  23.                                 // De gegevens van de bezoeker uit de database halen a.d.h.v. de opgegeven gebruikresnaam
  24.                                 $sql = "SELECT gebruikersnaam, wachtwoord FROM ".$db_prefix."leden WHERE gebruikersnaam='".$_POST['gebruikersnaam']."'";
  25.                                 $qry = mysql_query($sql)or die(mysql_error());
  26.                                 $row = mysql_fetch_array($qry);
  27.                                
  28.                                 // Klopt het wachtwoord wel?
  29.                                 if ($row['wachtwoord'] != md5($_POST['wachtwoord'])) {
  30.                                        
  31.                                         // Indien niet, vertellen we dit onze bezoeker.
  32.                                 echo '<div style="font-weight:bold; color:#cc0000;">Uw gebruikersnaam en/of wachtwoord blijken niet te kloppen.</div>';
  33.                                        
  34.                                 // als het wel klopt...
  35.                                 } else {
  36.                                
  37.                                         // ... starten we de sessie
  38.                                         session_start();
  39.                                        
  40.                                         // ... even nakijken ofdat onze bezoeker heeft aangegeven altijd ingelogd te willen blijven
  41.                                         if ($_POST['automatischinloggen']) {
  42.                                        
  43.                                                 // ... indien dit waar is, plaatsen we 2 cookies
  44.                                                 header('P3P: CP="ALL DSP COR NID CURa OUR STP PUR"');
  45.                                                 setcookie('gebruikersnaam', $row['gebruikersnaam'], time() + 5184000, "/");
  46.                                                 setcookie('wachtwoord', $row['wachtwoord'], time() + 5184000, "/");
  47.                
  48.                                         }
  49.        
  50.                                         // De bezoeker terugsturen naar de url waar hij van kwam
  51.                                         header ('Location: '.$_SERVER['HTTP_REFERER']);
  52.                                        
  53.                                 }
  54.                                
  55.                         }
  56.                
  57.                 }
  58.        
  59.         }
  60.  
  61. ?>


Ook hier is niet veel uitleg nodig, de commentaar in de code zegt genoeg zeker? :)

Nu we toch bezig zijn in die klasse kunnen we ineens de functie om onze bezoeker uit te loggen ook maken. Maak onder de vorige functie een nieuwe functie uitloggen() aan.

Om uit te kunnen loggen, moet de bezoeker eerst ingelogd zijn, dus:

PHP
  1. <?php
  2.  
  3. function uitloggen() {
  4.  
  5.         // De bezoeker moet ingelogd zijn voor hij kan uitloggen...
  6.         if ($_SESSION) {
  7.                
  8.                
  9.                
  10.         // De bezoekers was niet ingelogd
  11.         } else echo "Gelieve eerst in te loggen alvorens uit te loggen";
  12.                
  13. }
  14.  
  15. ?>


Als we zeker weten dat de bezoeker ingelogd is, maken we eerst de cookies leeg, want anders is hij de volgende keer terug ingelogd.

PHP
  1. <?php
  2.  
  3. header('P3P: CP="ALL DSP COR NID CURa OUR STP PUR"');
  4. setcookie('gebruikersnaam', '', time() + 5184000, "/");
  5. setcookie('wachtwoord', '', time() + 5184000, "/");
  6.  
  7. ?>


Daarna maken we een eind aan de sessie:

PHP
  1. <?php
  2.  
  3.  
  4. ?>


Tenslotte sturen we de bezoeker terug naar de pagina waar hij van kwam.
Let op, er staat geen typfout in de code, HTTP_REFERER is wel degelijk met een enkele r ;)

PHP
  1. <?php
  2.  
  3. header ('Location: '.$_SERVER['HTTP_REFERER']);
  4.  
  5. ?>


De volledige functie uitloggen() nogmaals:
PHP
  1. <?php
  2.  
  3.         function uitloggen() {
  4.        
  5.                 // De bezoeker moet ingelogd zijn voor hij kan uitloggen...
  6.                 if ($_SESSION) {
  7.                
  8.                         // cookies leegmaken
  9.                         header('P3P: CP="ALL DSP COR NID CURa OUR STP PUR"');
  10.                         setcookie('gebruikersnaam', '', time() + 5184000, "/");
  11.                         setcookie('wachtwoord', '', time() + 5184000, "/");
  12.                        
  13.                         session_destroy();
  14.                        
  15.                         // De bezoeker terugsturen van waar hij kwam
  16.                         header ('Location: '.$_SERVER['HTTP_REFERER']);
  17.                        
  18.                 // De bezoekers was niet ingelogd
  19.                 } else echo "Gelieve eerst in te loggen alvorens uit te loggen";
  20.                
  21.         }
  22.  
  23. ?>


Nu gaan we onze indexpagina een beetje uitbreiden. Het loginformulier dient enkel getoond te worden als de bezoeker niet is ingelogd. Als deze wel is ingelogd, kunnen we die ruimte gebruiken voor een link te plaatsen zodat hij zich kan uitloggen.

Vervang alle code tussen <body> en </body> door de onderstaande:

PHP
  1. <?php
  2.  
  3. // Nakijken of onze bezoeker reeds is ingelogd...
  4. if($_SESSION) echo '<a href="'.$_SERVER['PHP_SELF'].'?actie=uitloggen">Uitloggen</a>';
  5. else {
  6.  
  7.  ?>
  8. <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
  9. Gebruikersnaam: <input type="text" name="gebruikersnaam" size="10" /><br />
  10. Wachtwoord: <input type="password" name="wachtwoord" size="10" /><br />
  11. Remember me:<input type="checkbox" checked="checked" name="automatischinloggen" /><br />
  12. <input type="submit" value="Inloggen" name="inloggen" />
  13. </form>
  14. <a href="registreren.php">Registreren</a>
  15. <?php } ?>


Code spreekt voor zich, maar er zal nog niet veel gebeuren als de bezoeker zich wel uitloggen.

Daarom gaan we boveaan nog een klein blokje code toevoegen. Plaats onderstaande code tussen het stuk waar we de files includen en het stuk waar we nakijken of de bezoeker probeert in te loggen.

PHP
  1. <?php
  2.  
  3. if ($_GET['actie'] == "uitloggen")  {
  4.  
  5.  $user = new user;
  6.  $user ->uitloggen();
  7.  
  8. }
  9.  
  10. ?>


Uiteindelijk zou je index.php pagina er zo moeten uitzien:

PHP
  1. <?php
  2.  
  3. // Configuratiebestand beschikbaar maken zodat we toegang hebben tot onze database
  4. require_once "config.inc.php";
  5. // User klasse beschikbaar stellen
  6. require_once "login.class.php";
  7.  
  8. if ($_GET['actie'] == "uitloggen")  {
  9.  
  10.  $user = new user;
  11.  $user ->uitloggen();
  12.  
  13. }
  14.  
  15. // Nakijken of het forumier submit is
  16. if ($_POST['inloggen']) {
  17.  
  18.         // We maken een nieuw object aan...
  19.  $user = new user;
  20.  // ... en kijken na of de ingevulde gegevens kloppen
  21.  $user ->inloggen();
  22.  
  23. }
  24.  
  25. ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  26. <html>
  27. <head>
  28. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  29. <title>Login - www.multidesk.be</title>
  30. </head>
  31. <body>
  32. <?php
  33.  
  34. // Nakijken of onze bezoeker reeds is ingelogd...
  35. if($_SESSION) echo '<a href="'.$_SERVER['PHP_SELF'].'?actie=uitloggen">Uitloggen</a>';
  36. else {
  37.  
  38.  ?>
  39. <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
  40. Gebruikersnaam: <input type="text" name="gebruikersnaam" size="10" /><br />
  41. Wachtwoord: <input type="password" name="wachtwoord" size="10" /><br />
  42. Remember me:<input type="checkbox" checked="checked" name="automatischinloggen" /><br />
  43. <input type="submit" value="Inloggen" name="inloggen" />
  44. </form>
  45. <a href="registreren.php">Registreren</a>
  46. <?php } ?>
  47. </body>
  48. </html>


Voila, je inlogsysteem zou moeten werken nu. Indien je nog vragen hebt, verwijs ik je graag door naar een van de fora.

Uitbreiding

Nu je je loginscript hebt, kan je ook heel eenvoudig andere pagina's beveiligen. Hieronder kan je een simpel voorbeeld vinden.

PHP
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  5. <title>Beveiligde Pagina - www.multidesk.be</title>
  6. </head>
  7. <body>
  8.  
  9. <?php
  10.  
  11. if ($_SESSION) {
  12.  
  13.         echo 'Welkom '. $_SESSION['gebruikersnaam'];
  14.        
  15. } else {
  16.  
  17.         echo 'Gelieve in te loggen';
  18.        
  19. }
  20.  
  21. ?>
  22.  
  23. </body>
  24. </html>
Dit artikel werd geschreven door Martijn op donderdag 1 juli 2004 om 12:51 en werd sindsdien 34250 keer gelezen.

  • Pagina
  • <
  • 1
  • [2]

Bericht geplaatst door een gast op vrijdag 28 maart 2008 om 14:56:19.
Niet bepaald de properste code. Een paar tips:

- Gebruik OOP niet nutteloos. Dit was nutteloos. Het kon evengoed gewoon in files gestoken worden.
- Data escapen! mysql_real_escape_string() is de correcte functie. HTML wordt pas bij output eruit gefilterd, niet in de database.

Dat zijn de belangrijkste opmerkingen hier.
Bericht geplaatst door een gast op vrijdag 27 augustus 2010 om 17:33:58.
hoe kan ik het voor elkaar krijgen dat ik naar de beveiligde pagina ga
  • Pagina
  • <
  • 1
  • [2]