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 34248 keer gelezen.

  • Pagina
  • [1]
  • 2

Bericht geplaatst door Bridge_Burner op zondag 11 juli 2004 om 14:59:56.
Bridge_Burner heeft nog geen avatar toegevoegd
Multiviteit: 404
eikeba :)
leuke FAQ maar als je met klassen wilt werken doe je eigenlijk een foutje in mijn ogen :)
het naar het scherm printen van html bij bv uitloggen heeft op zich nix met een user object te maken :)

een user klasse zou ik aanmaken die alles definieert van één user en als je dan een lijst met users wilt afdrukken dan doorloop je je collection van user objecten, of bv om het user object van een ingelogde persoon in de session te bewaren ...... that's the power van klassen

maar nu maak je eigenlijk een klasse aan die losstaande functies bezitten, dan kan je al evengoed een include bestand maken met die functie's in :)

ok misschien ni helemaal duidelijk wa ik bedoel :)
Bericht geplaatst door Martijn op zondag 11 juli 2004 om 15:09:56.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Ja 't is wel geheel duidelijk hoor. 't Was eigenlijk gewoon de bedoeling om met een redelijk korte code in de pagina toch functies te kunnen aanspreken, in dit geval functies in een klasse.

Je hebt volkomen gelijk als je zegt dat een klasse niet voor dit soort code dient, maar beeld je eens in dat je hier nog eens aparte functies ging aanmaken, dan was het meteen ook een ander soort code, ik heb er gewoon expleciet voor gekozen om hier met klassen te werken, zodat je eenvoudig dit kon uitbreiden, mocht iemand zich ervoor geroepen voelen. ;-)
Met vriendelijke groeten,
Martijn Wouters
Bericht geplaatst door Bridge_Burner op zondag 11 juli 2004 om 15:15:47.
Bridge_Burner heeft nog geen avatar toegevoegd
Multiviteit: 404
en dan gebruiken we :

PHP
  1.  
  2. <?php
  3. class Foo {
  4.    public static function aStaticMethod() {
  5.        // ...
  6.    }
  7. }
  8.  
  9. Foo::aStaticMethod();
  10. ?> 
  11.  

:p ok bitneukerij ma tis wel schoner en OO correcter :)
Deze tekst werd het laatst bewerkt door Bridge_Burner op zondag 11 juli 2004 om 15:18:03.
Bericht geplaatst door peterdewebster op zondag 11 juli 2004 om 18:11:57.
peterdewebster's avatar
Multiviteit: 2
Hallo, :D

Kan je het geheel in een paar bestanden zetten voor mij?
Ik kan helaas geen php (n) maar, wel heel goed HTML :)

Alvast bedankt greetzz peterrr
PETER!!!!!!!!!!!!!!!!!!!!!!!!!!
Bericht geplaatst door Martijn op maandag 12 juli 2004 om 09:36:49.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Is toch net zo moeilijk. Alles is aangegeven in volgorde, je hoeft enkel het artikel te volgen en de code te plakken.

Dit artikel is bedoeld om mensen wat bij te brengen, niet om alles gewoon klakkeloos te kopieëren; lees alles door en je systeem werkt, dat hebben de vorige reactie(s) hier en op de fora reeds bewezen ;)
Met vriendelijke groeten,
Martijn Wouters
Bericht geplaatst door peterdewebster op dinsdag 13 juli 2004 om 17:24:25.
peterdewebster's avatar
Multiviteit: 2
Jah dat weet ik maar, ik kan helemaal geen php wel goed html.

maar ik heb het programma niet voor php.

Greetzzzz, peterdewebster
PETER!!!!!!!!!!!!!!!!!!!!!!!!!!
Bericht geplaatst door Martijn op woensdag 14 juli 2004 om 16:08:02.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Gewoon notepad/dreamweaver is voldoende. De bestanden wel opslaan als *.php he ;-)
Met vriendelijke groeten,
Martijn Wouters
Bericht geplaatst door een gast op woensdag 4 augustus 2004 om 16:18:06.
Hoi,

Ik heb dit inlogsysteem even geprobeerd, maar ik loop tegen het volgende probleem aan:

registreren in database gaat prima
inloggen daarna lijkt goed te gaan, maar i.p.v. dat ik een venster met uitloggen krijg, krijg ik een leeg inlogvenster; naar een beveiligde pagina gaan ( zoals voorbeeld is niet mogelijk -> gelieve in te loggen ).
Bij eerst registeren van nieuwe naam logt ie automatisch in. Ga ik dan naar inlogpagina dan doet ie 't goed -> uitloggen...
Maar wil ik naar een beveiligde pagina, dan zegt ie nog steeds dat ik eerst moet inloggen... D'r gaat dus iets niet goed met de sessions !!!!

Is dit probleem bekend en zo ja, wat moet ik eraan doen. Typfouten kan haast niet, heb 't ook al letterlijk gecopieerd. Graag een reactie.
en alvast bedankt

M.vr.gr.

Niels
Bericht geplaatst door Tom op dinsdag 7 september 2004 om 14:22:42.
Tom's avatar
Multiviteit: 254
Das ne mooie

en dat vind ik minder aan jsp,dat het request object (post,get etc) en het session object niet gekend is in klassen

maar langs de andere kant zijn die klassen dan weer volledig op zich staande programma stukken
en wat nog leuker is
je kan die klasse binden aan je sessie :)

kzal binnenkort ook es moeite doen om een gelijkaardig tutke te schrijven voor jsp
Bericht geplaatst door rObkE op dinsdag 7 september 2004 om 21:56:16.
rObkE heeft nog geen avatar toegevoegd
Multiviteit: 3765
In PHP kun je ook gewoon een klasse schrijven om je sessies te regelen. :?
Zelfs op MD hier heeft martijn dat gedaan.
Bericht geplaatst door een gast op vrijdag 15 oktober 2004 om 22:47:45.
Bij het registreren krijg ik dit :
Warning: Supplied argument is not a valid MySQL result resource in /var/www/deserted/test/login.class.php on line 21
Beste test,
En de tekst van we hebben je ook ineens ingelogd

Bij het uitloggen dit:
Warning: Cannot add header information - headers already sent by (output started at /var/www/deserted/test/config.inc.php:23) in /var/www/deserted/test/login.class.php on line 126

Warning: Cannot add header information - headers already sent by (output started at /var/www/deserted/test/config.inc.php:23) in /var/www/deserted/test/login.class.php on line 127

Warning: Cannot add header information - headers already sent by (output started at /var/www/deserted/test/config.inc.php:23) in /var/www/deserted/test/login.class.php on line 128

Warning: Cannot add header information - headers already sent by (output started at /var/www/deserted/test/config.inc.php:23) in /var/www/deserted/test/login.class.php on line 133

en dan nog iets die gegevens worden helemaal niet in mijn database geschreven ook al laat ik da van overeenkomende usernames weg

plz help me
Bericht geplaatst door een gast op woensdag 20 oktober 2004 om 16:09:57.
ik krijg ook dezelfde foutmelding:

Warning: mysql_result(): supplied argument is not a valid MySQL result resource in c:\domains\sabine-en-bastiaan.sohosted.com\wwwroot\content\fotoalbum\content\main\login\login.class.php on line 17

terwijl daaronder idd wordt weergegeven dat het registreren is gelukt...
heb wel wat php kennis maar net niet genoeg om dit op te lossen.
Ben er ook al meer dan 2 uur mee bezig...iemand die de fout ziet?
Bericht geplaatst door een gast op donderdag 21 oktober 2004 om 19:07:45.
Leuk script, als het allemaal werkt! Beter even testen voordat je het uitbrengt :( Vooral jammer voor de newbies want die halen de fout er niet ff uit!
Bericht geplaatst door Martijn op donderdag 21 oktober 2004 om 20:12:02.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Het script is uitvoerig getest geweest en het zou normaal gezien bugvrij moeten zijn. Het kan natuurlijk altijd nog dat er ergens een foutje inzit, maar het vreemde is dat zulke kritische delen bij sommige personen wel werken en bij anderen niet.

Hierdoor denk ik dat jullie waarschijnlijk vergeten zijn 1 de tabel aan te maken of 2 de tabel gewoon een verkeerde naam hebben gegeven:).

Het kan ook zijn dat je verbinding met je database niet correct gemaakt is, kijk dit allemaal even na en als het dan nog niet lukt, kan je altijd eens ee draadje zetten op een van onze fora :).

Dze reactiemogelijkheid dient in feite enkel om aanpassingen aan de code e.d. te plaatsen, bijvoorbeeld een bijgewerkte versie ;).
Met vriendelijke groeten,
Martijn Wouters
Bericht geplaatst door een gast op zondag 14 november 2004 om 16:16:34.
Ik krijg gewoon een wit scherm :?:?
Bericht geplaatst door een gast op woensdag 17 november 2004 om 23:03:48.
zou iemand dit voor mij kunnen maken en doorsturen naar --------
want ik zou niet goed weten hoe ik dat nu moet maken, het lukt gewoon niet
Deze tekst werd het laatst bewerkt voor 8 % door rObkE op donderdag 18 november 2004 om 08:59:02.
Bericht geplaatst door rObkE op donderdag 18 november 2004 om 08:59:19.
rObkE heeft nog geen avatar toegevoegd
Multiviteit: 3765

Dixit

Gast (op 17/11/2004 23:03:48) zei:
zou iemand dit voor mij kunnen maken en doorsturen naar --------
want ik zou niet goed weten hoe ik dat nu moet maken, het lukt gewoon niet
Post je vragen eens op de forums...
Bericht geplaatst door Slicer op dinsdag 14 december 2004 om 20:39:13.
Slicer's avatar
Multiviteit: 68
nu, er zijn aan dit script een paar dingen fundamenteel mis:

de tabelopbouw:

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. `naam` 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. );


`wachtwoord` VARCHAR( 100 ) NOT NULL

het wachtwoord is geMD5t en dus ALTIJD 128-bit voorgesteld als een string van 32 hexadecimale cijfers

`wachtwoord` CHAR( 32 ) NOT NULL is dus meer dan voldoende

`registratiedatum` VARCHAR( 20 ) NOT NULL

deze registratiedatum wordt bepaald door de uitkomst van time (), dit geeft een integer weer

`registratiedatum` INT( 10 ) NOT NULL is dus meer dan voldoende

Deze 2 veranderingen leveren een plaatsbesparing op van 84 bytes en zullen maken dat je databank nog efficiënter kan werken

de code:

PHP
  1. if ($_POST['registreren']) {


deze regel check of de waarde van $_POST['registreren'] waar of vals is, terwijl je eigenlijk wil kijken of deze variable bestaat, het moet dus zijn:

PHP
  1. if (isset ($_POST['registreren'])) {


de registratiefunctie zelf:

1) er wordt niet gecheck of alle variabelen echt bestaan
2) er wordt gekeken of de gekozen variabelen niet leeg zijn (lengte 0) maar er wordt niet gekeken of ze niet te LANG zijn:
gebruikersnaam en naam mogen maximum 100 characters zijn, emailadres maximum 255 karakters, indien de gegevens strings langer zijn zal mysql automagisch de strings op de gepaste lengte afkappen (ik gok dat dit niet de bedoeling is). Ook moet je hierbij opletten dat als de waarde kleiner is dan het maximum aantal karakters de functie addslashes (tegen SQL injection) ervoor zorgt dat de lengte TOCH groter zal worden (en naam van precies 100 tekens met een ' erin bvb)

PHP
  1. if (mysql_result(mysql_query("SELECT COUNT(*) FROM ".$db_prefix."leden WHERE gebruikersnaam='".$_POST['gebruikersnaam']."'"),0) != 0)


de eerste sql-injectie mogelijkheid, $_POST['gebruikersnaam'] is niet geaddslashes, op zich niet erg omdat het niks schadelijks kan doen normaal (tenzij men selects kan mengen met andere statements).
De volgende vorm is mss efficiënter (maar dat is mijn mening)

PHP
  1. if (mysql_num_rows (mysql_query("SELECT id FROM ".$db_prefix."leden WHERE gebruikersnaam='".$_POST['gebruikersnaam']."'") != 0)


De invoegquery:

CODE
  1. mysql_query("INSERT INTO ".$db_prefix."leden  (
  2. gebruikersnaam,
  3. wachtwoord,
  4. naam,
  5. achternaam,
  6. emailadres,
  7. registratiedatum
  8. ) VALUES (
  9. '".$_POST['gebruikersnaam']."',
  10. MD5('".$_POST['wachtwoord1']."'),
  11. ".addslashes(htmlspecialchars($_POST['naam']))."' ,
  12. '".addslashes(htmlspecialchars($_POST['achternaam']))."' ,
  13. '".addslashes(htmlspecialchars($_POST['emailadres']))."' ,
  14. '".time()."'
  15. )");


Hier is $_POST['gebruikersnaam'] weer niet geaddslashed en is er dus weer SQL injectie mogelijk, maar deze is op zich niet zo erg. Verder worden de variabelen hier niet getrimed zoals in het begin en is time () een string en geen een int.

CODE
  1. mysql_query("INSERT INTO ".$db_prefix."leden  (
  2. gebruikersnaam,
  3. wachtwoord,
  4. naam,
  5. achternaam,
  6. emailadres,
  7. registratiedatum
  8. ) VALUES (
  9. '".addslashes (htmlspeciachars (trim ($_POST['gebruikersnaam'])))."',
  10. MD5('".trim ($_POST['wachtwoord1'])."'),
  11. ".addslashes(htmlspecialchars(trim($_POST['naam'])))."' ,
  12. '".addslashes(htmlspecialchars(trim ($_POST['achternaam'])))."' ,
  13. '".addslashes(htmlspecialchars(trim($_POST['emailadres'])))."' ,
  14. ".time()."
  15. )");


is een betere versie

de inlogfunctie:

PHP
  1. if ($_SESSION)


Hier wil men checken of men al is ingelogd, maar dit moet natuurlijk een check zijn of een variabele al bestaat, niet of $_SESSION (dat een array is) een boolean is met waarde waar of vals. Tevens mogen gasten dus ook geen sessievariabelen meekrijgen of ze worden beschouwd als ingelogde.
Hier moet dus staan:

PHP
  1. if (isset ($_SESSION['uid']))


Bij de check of iets werd ingevuld werd trim niet gedaan, een spatie zal dus ook voor werk zorgen en onze server iets meer belasten.

PHP
  1. $sql = "SELECT gebruikersnaam, wachtwoord FROM ".$db_prefix."leden WHERE gebruikersnaam='".$_POST['gebruikersnaam']."'";


Weer SQL injection mogelijk en dit keer is het erger, via manupilatie van $_POST['gebruikernaam'] kan men inloggen als IEDEREEN, dit maakt het script dus eigenlijk nutteloos.

PHP
  1. if ($_POST['automatischinloggen']) {


om te checken of een checkbox werd aangevinkt moet je kijken of de waarde BESTAAT en niet of er een waar of vals waarde werd meegestuurd.

PHP
  1. if (isset ($_POST['automatischinloggen'])) {


De uitlog functie:

weer geen isset gebruikt

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


in de cookies wordt een lege variabele gestoken, we kunnen eigenlijk evengoed de cookies wissen:

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


Ok, dat was een (korte) bespreking van dingen die eigenlijk beter kunnen.

Een extra opmerking:
sommige functies worden 2 keer aanroepen (addslashes, trim enz) we kunnen dit eigenlijk vermijden door de variabelen in het begin al te verwerken, voor registreren zou dit geven:

PHP
  1. <?php
  2. $gebruikersnaamisset ($_POST['gebruikersnaam']) ? addslashes (htmlspecialchars (trim ($_POST['gebruikersnaam']))) : "";
  3. $wachtwoord1 = isset ($_POST["wachtwoord1"]) ? md5 (trim ($_POST['wachtwoord1'])) : "";
  4. $wachtwoord2 = isset ($_POST["wachtwoord2"]) ? md5 (trim ($_POST['wachtwoord2'])) : "";
  5. $naam = isset ($_POST["naam"]) ? addslashes (htmlspecialchars ( trim ($_POST['naam']))) : "";
  6. $achternaam = isset ($_POST["achternaam"]) ? addslashes (htmlspecialchars (trim ($_POST['achternaam']))) : "";
  7. $emailadres = isset ($_POST["emailadres"]) ? addslashes (htmlspecialchars (trim ($_POST['emailadres']))) : "";
  8. $woonplaats = isset ($_POST["woonplaats"]) ? addslashes (htmlspecialchars ($_POST['woonplaats']))) : "";
  9. ?>


Als je nu met deze variabelen verder werkt moet je je geen zorgen maken dat bij controle of het te lang is er nog extra karakters kunnen bijkomen, sql-injection enz.
Deze tekst werd het laatst bewerkt voor 4 % door Slicer op dinsdag 14 december 2004 om 20:39:57.
Bericht geplaatst door een gast op donderdag 6 januari 2005 om 20:58:23.
Hoi,

Ik vind het een geweldig script, maar ik krijg 1 foutmelding op het moment van uitloggen:
Fatal error: Call to undefined function: uitloggen() in /home/wwwppl/s410652/html/login/index.php on line 11

Ik heb helaas geen verstand van PHP en krijg het probleem niet opgelost.... :( Voor de rest werkt het script uitstekend!

Kan iemand me helpen?
Groeten,
Deodat
Bericht geplaatst door Martijn op maandag 24 januari 2005 om 23:14:40.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Gelieve je vragen in de fora te stellen, zoals in de regels staat beschreven.

@ Eerste gast: ben je zeker dat je alle bestanden geïnclude hebt?

Kort een antwoord wat betreft de vraag van de laatste gast: voeg deze code in bij bijvoorbeeld PHPMyAdmin.

In't geval dat het probleem nog niet opgelost is, raad ik je beiden aan om een topic te openen in onze forumsectie ;).
Met vriendelijke groeten,
Martijn Wouters
  • Pagina
  • [1]
  • 2