U bevindt zich hier: Forum » Tutorials » [PHP] Login systeem OOP
   Actief Topic: [PHP] Login systeem OOP

Vorige ( 1,2 ) Volgende

vlerknozem
Admin
avatar
# Gepost op 05-08-2009 09:17
Bewerkt door vlerknozem op 07-01-2010 20:38


Enige tijd terug heb ik een login systeem gemaakt. Echter deze had nog wat fouten. Ik was er niet tevreden over. Nu heb ik een nieuwe geschreven met behulp van OOP. Deze tutorial over OOP is misschien handig om mee te beginnen. Dit script is voor gevorderden.

Laten we de stappen eens gaan doornemen.

1. De database
Open phpMyAdmin, en maak indien nodig een nieuwe database aan. Zorg in ieder geval dat je in de juiste database bent. Vervolgens klik je op de knop "SQL" die je links boven ziet. Er opent zich een nieuw venster waar je de volgende code invoegt:

Plain | Plain new window | SQL code:
  1. CREATE TABLE IF NOT EXISTS `gebruikers` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `gebruikersnaam` varchar(54) NOT NULL,
  4.   `wachtwoord` varchar(54) NOT NULL,
  5.   PRIMARY KEY  (`id`)
  6. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
  7.  
  8. INSERT INTO `gebruikers` (`id`, `gebruikersnaam`, `wachtwoord`) VALUES
  9. (1, 'test', 'test');
  10.  
  11. CREATE TABLE IF NOT EXISTS `logins` (
  12.   `uid` varchar(54) NOT NULL,
  13.   `sid` varchar(256) NOT NULL,
  14.   `ip` varchar(256) NOT NULL,
  15.   `datum` datetime NOT NULL
  16. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;


2. Het configuratiebestand
Maak een bestand aan genaamd config.php.

Plain | Plain new window | PHP code:
  1. <?php
  2. /*
  3. | Dit is het configuratiebestand van het loginsysteem. Hier worden
  4. | bepaalde dingen ingesteld die door het gehele loginsysteem gebruikt
  5. | worden.
  6. |
  7. | Gemaakt door Vlerknozem (dit hele loginsysteem eigenlijk!)
  8. */
  9.  
  10. # Een beveiliging om te voorkomen dat men
  11. # probeert je config.php te openen
  12. if(basename($_SERVER['PHP_SELF']) == "config.php")
  13. {
  14.     # De bezoeker terug verwijden naar de index
  15.    header("Location: ../index.php");
  16.    
  17.     # En stoppen met PHP uitvoeren, voor de zekerheid
  18.    exit;
  19. }
  20.  
  21. # Een config array aanmaken
  22. $cfg = array();
  23.  
  24. # De mysql host, waar je database op draait. Is meestal localhost
  25. define("mysql_host", 'localhost');
  26.  
  27. # De mysql gebruikersnaam. Is meestal niet root
  28. define("mysql_user", 'root');
  29.  
  30. # Het mysql wachtwoord, is eigenlijk nooit leeg
  31. define("mysql_password", '');
  32.  
  33. # De tabel waar het systeem op draait. Als je de SQL niet hebt uitgevoerd moet je deze aanpassen
  34. define("mysql_database", 'loginsysteem');
  35.  
  36. # De login sessie tijd, het aantal uren dat je bent ingelogd dus.
  37. define("login_session_time", 24);
  38.  
  39. # MD5 gebruiken om wachtwoorden te coderen? Staat standaard uit
  40. define("login_password_md5", false);
  41.  
  42. # Fouten weergeven ? Alleen handig als je aan het testen bent!
  43. define("show_errors", false);
  44.  
  45. /*
  46. | De benodigde database velden instellen
  47. | Elk veld dat je bij het registeren wilt hebben kan je hier toevoegen als nieuwe array waarde.
  48. | De syntax is: 'veldnaam:flag1|flag2'
  49. | Het veldnaam en de flags scheid je met dubbele punt. De flags scheid je van elkaar met een verticaal streepje.
  50. |
  51. | Flags:
  52. |   verplicht   = maak het veld verplicht
  53. |   uniek       = De ingevulde waarde voor dit veld mag maar een keer gebruikt worden. (handig voor gebruikersnamen)
  54. |   min=3       = Minimaal in te vullen karakters is in dit geval 3.
  55. |   max=10      = Maximaal in te vullen karakters is in dit geval 10.
  56. |   ==wachtwoord2   = De ingevulde waarde van het huidge veld moet overeen komen met in dit geval de inhoud van het veld 'wachtwoord2'
  57. |   email       = Er wordt gecontrolleerd of de ingevulde waarde voldoet aan de eisen van een geldig e-mailadres.
  58. |   md5     = Codeer de ingevulde waarde naar md5.
  59. */
  60. $database_velden = array();
  61. array_push($database_velden, 'gebruikersnaam:verplicht|uniek|min=3|max=15');
  62. array_push($database_velden, 'wachtwoord:verplicht|min=3|max=10|==wachtwoord2');
  63. ?>

Vul hier de juiste gegevens in. Als je je wachtwoorden als MD5 wilt opslaan, verander dan de variabele 'login_password_md5' naar 'true'.

3. Het login scherm.
Natuurlijk is er een scherm nodig waar men zich kan inloggen. Deze zetten we ook in een apart bestand, en kunnen we later makkelijk includen.
We noemen dit bestand 'login.inc.php'.

Plain | Plain new window | PHP code:
  1. <?php
  2. if($login->fouten) {
  3.     echo "<p>".$login->fouten."</p>";
  4. }
  5. ?>
  6. <form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post">
  7.     <input type="hidden" name="actie" value="login" />
  8.     Gebruikersnaam: <input type="text" name="gebruikersnaam" /><br />
  9.     Wachtwoord: <input type="password" name="wachtwoord" /><br />
  10.     <input type="submit" value="login" />
  11. </form>


Login fouten worden hier dus ook in weergeven. Let op dat het field "actie" belangrijk is, zodat het systeem weet dat dit het login formulier is. Deze manier is handig bij het gebruik van meerdere formulieren met zelfde veldnamen.

4. De registratie pagina
Met onderstaande code (ik heb het in registreer.php gedaan) kan je gebruikers zich laten registreren. Als je een veld erbij wild dan kan dat. Let op dat je bij in de database ook een veld toevoegd met dezelfde naam als bij name="". Ook onderaan header.php moet je een regel maken bij $login->database_velden, met de juiste instellingen.
Plain | Plain new window | PHP code:
  1. <?php
  2. /*
  3. | De registreer pagina waar nieuwe leden zich kunnen registreren.
  4. | Ook hier is niet zoveel spannends aan de hand
  5. |
  6. | We beginnen met de hoofdklasse in te voegen.
  7. */
  8.  
  9. include("loginsysteem/header.php");
  10.  
  11. /*
  12. | Als er fouten zijn (na registreren dan) gaan we die nu tonen.
  13. */
  14. if($login->fouten)
  15. {
  16.     print "<p>".$login->fouten."</p>";
  17. } else {
  18.     echo 'Je bent succesvol geregistreerd.';
  19. }
  20.  
  21. /*
  22. | Als er geen fouten zijn dan het formulier
  23. */
  24. ?>
  25. <form method="post" action="">
  26.     <input type="hidden" name="actie" value="registreer_gebruiker" />
  27.     <p>Gebruikersnaam</p>
  28.     <p><input type="text" name="gebruikersnaam" /></p>
  29.     <p>Wachtwoord</p>
  30.     <p><input type="password" name="wachtwoord" /></p>
  31.     <p>Controle wachtwoord</p>
  32.     <p><input type="password" name="wachtwoord2" /></p>
  33.     <p><input type="submit" value="Registreer!" /></p>
  34. </form>


5. De beveiligde pagina's
Nu moet je alle beveiligde pagina voorzien van het volgende:

Plain | Plain new window | PHP code:
  1. <?php
  2. include('header.php');
  3. ?>
  4. <html>
  5. <head>
  6.     <title>Test pagina</title>
  7. </head>
  8. <body>
  9.     Dit is een voorbeeld pagina. Iedereen
  10.     Hieronder komt een login menu:<br />
  11.     <?php
  12.     if(!$login->get_login_info()) {
  13.         // Niet ingelogd, login deel weergeven
  14.         include('login.inc.php');
  15.     } else {
  16.                ?>
  17.             Welkom <b><?php echo $login->get_login_info('gebruikersnaam');?>!</b><br />
  18.             <a href="index.php?actie=uitloggen">Uitloggen</a>
  19.         <?php
  20.     }
  21.     ?>
  22. </body>
  23. </html>


6. Gebruikersinfo opvragen binnen een andere klasse
Hiervoor hoef je natuurlijk geen nieuwe instantie te maken. Doordaad bepaalde data static is, kan je mits de klasse al reeds geladen is, de data overal opvragen. Probeer maar eens met deze code:
Plain | Plain new window | PHP code:
  1. <?php
  2. echo login::get_login_info('gebruikersnaam');
  3. ?>


7. Gebruikers info weergeven
Stel je wilt een profiel pagina maken, en je wilt dat er bijvoorbeeld een website url zichtbaar wordt, voeg je in de database gewoon het veld 'website' toe.
Met deze code kan je een veld opvragen:

Plain | Plain new window | PHP code:
  1. <?php
  2. echo $login->get_login_info('website');
  3. ?>


Om alles op te vragen:
Plain | Plain new window | PHP code:
  1. <?php
  2. $info = $login->get_login_info('alles');
  3. echo $info['gebruikersnaam'] . "<br />";
  4. echo $info['website'] . "<br />";
  5. ?>


8. Het header bestand
We gaan een header bestand maken. Deze bevat het hele systeem. Dit bestand noemen we 'header.php'. Hierin hoef je niks te veranderen.

Plain | Plain new window | PHP code:
  1. <?php
  2. /*
  3. | Dit is de kern van het hele loginsysteem. Hier gebeurt alles.
  4. | Dit is een enkele klasse die overal voor zorgt.
  5. |
  6. | Eerst een beveiliging (ook gevonden in config.php, zie die file voor
  7. | verdere uitleg)
  8. */
  9. if(basename($_SERVER['PHP_SELF']) == "header.php")
  10. {
  11.     header("Location: ../index.php");
  12. }
  13.  
  14. /*
  15. | Het configuratiebestand laden om verbinding te kunnen maken met de database
  16. | en om wat andere instellingen te kunnen gebruiken die later nodig zijn.
  17. */
  18. include_once("config.php");
  19.  
  20. /*
  21. | Nu beginnen we aan de klasse, dit is een simpele klasse die
  22. | niets meer en niets minder doet dan waarvoor hij gemaakt is:
  23. | gebruikersauthenticatie.
  24. */
  25. class login
  26. {
  27.     /*
  28.     | Een variabele om aan te geven of de gberuiker is ingelogd,
  29.     | wat standaard niet is, dus de waarde 'false' krijgt
  30.     */
  31.     private static $loginsessie = false;
  32.  
  33.     /*
  34.     | Een variabele om fouten in op te slaan die het systeem
  35.     | teruggeeft.
  36.     */
  37.     public $fouten = "";
  38.    
  39.     /*
  40.     | Een variabele (array) om wat informatie over de gebruikers
  41.     | in op te slaan.
  42.     */
  43.     private static $gebruikersinfo = array();
  44.    
  45.     /*
  46.     | Een variabele om database velden in op te slaan
  47.     */
  48.     public $database_velden = array();
  49.    
  50.     /*
  51.     | Een variabele die bijhoud hoeveel pogingen een gebruiker al
  52.     | heeft gemaakt om in te loggen. We beginnen met tellen bij 0
  53.     */
  54.     private $recheck = 0;
  55.    
  56.    
  57.     /*
  58.     | Deze functie word aangeroepen bij het laden van de klasse.
  59.     | Hier word de verbinding met de database tot stand gebracht,
  60.     | gecontroleerd of er al een sessie is, en word er afgewacht
  61.     | tot de gebruiker wil uitloggen
  62.     */
  63.     public function __construct()
  64.     {
  65.         /*
  66.         | Verbinding maken met de database. De informatie word uit config.php
  67.         | gehaald om te kunnen verbinden.
  68.         */
  69.         $verbinding = mysql_connect(mysql_host, mysql_user, mysql_password);
  70.         mysql_select_db(mysql_database, $verbinding);
  71.        
  72.         /*
  73.         | Als er fouten zijn en fouten mogen getoond worden dan
  74.         | worden ze nu opgeroepen (en later pas weergegeven!)
  75.         */
  76.         if(show_errors == true && mysql_error())
  77.         {
  78.             throw new Exception("MySQL liep tegen de volgende fout aan: <br />".mysql_error());
  79.         }
  80.        
  81.         /*
  82.         | Controleren op een login sessie!
  83.         */
  84.         $this->check_session();
  85.        
  86.         /*
  87.         | De logout actie koppelen aan de end_session functie welke mensen
  88.         | uitlogd.
  89.         */
  90.         if(isset($_GET['actie']) && $_GET['actie'] == "uitloggen" && self::$loginsessie === true)
  91.         {
  92.             $this->end_session();
  93.         }
  94.     }
  95.    
  96.     /*
  97.     | De init functie. Deze zorgt ervoor dat wanneer de gebruiker inlogt of registreert
  98.     | hij/zij de juiste pagina voor z'n neus krijgt.
  99.     */
  100.     public function init()
  101.     {
  102.         /*
  103.         | Iemand heeft ergens een formulier verzonden wat bij dit loginsysteem hoort
  104.         */
  105.         if($_SERVER['REQUEST_METHOD'] == "POST" && self::$loginsessie === false)
  106.         {
  107.             /*
  108.             | En het 'actie' veld is gezet, tijd voor wat actie.
  109.             */
  110.             if(isset($_POST['actie']))
  111.             {
  112.                 /*
  113.                 | Om een grote if-else lussen constructie tegen te
  114.                 | gaan doen we het in een switch, dat is makeklijker
  115.                 | uit te breiden.
  116.                 */
  117.                 switch($_POST['actie'])
  118.                 {
  119.                     case "login": $this->controleer_gegevens(); break;
  120.                     case "registreer_gebruiker": $this->registreer_gebruiker(); break;
  121.                 }
  122.             }
  123.         }
  124.     }
  125.    
  126.     /*
  127.     | Een functie om het IP-adres van de gebruiker mee te achterhalen
  128.     */
  129.     public function get_ip()
  130.     {
  131.         /*
  132.         | Als PHP gebruikt maakt van $_SERVER,
  133.         | meerdere pogingen doen om het IP te achterhalen
  134.         | en in $realip weg te schrijven.
  135.         */
  136.         if(isset($_SERVER))
  137.         {
  138.             if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  139.             {
  140.                 $realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  141.             }
  142.             elseif(isset($_SERVER['HTTP_CLIENT_IP']))
  143.             {
  144.                 $realip = $_SERVER['HTTP_CLIENT_IP'];
  145.             }
  146.             else
  147.             {
  148.                 $realip = $_SERVER['REMOTE_ADDR'];
  149.             }
  150.         }
  151.        
  152.         /*
  153.         | Als PHP geen gebruik maakt van $_SERVER
  154.         | moeten we wat anders proberen.
  155.         */
  156.         else
  157.         {
  158.             if(getenv('HTTP_X_FORWARDED_FOR'))
  159.             {
  160.                 $realip = getenv('HTTP_X_FORWARDED_FOR');
  161.             }
  162.             elseif(getenv('HTTP_CLIENT_IP'))
  163.             {
  164.                 $realip = getenv('HTTP_CLIENT_IP');
  165.             }
  166.             else
  167.             {
  168.                 $realip = getenv('REMOTE_ADDR');
  169.             }
  170.         }
  171.        
  172.         /*
  173.         | De variabele realip returnen, zodat we die kunnen gebruiken
  174.         */
  175.         return $realip;
  176.     }
  177.    
  178.     /*
  179.     | Een functie om gebruikers te registreren. Word aangeroepen in init().
  180.     | Het woord 'private' betekent dat je deze functie alleen in deze klasse
  181.     | (dit bestantd) mag aanroepen. Als je dat niet doet krijg je een foutmelding
  182.     */
  183.     private function registreer_gebruiker()
  184.     {
  185.         /*
  186.         | Even kiken of het actie veld gezet is en de waarde correct is
  187.         */
  188.         if(isset($_POST['actie']) && $_POST['actie'] == 'registreer_gebruiker')
  189.         {          
  190.             $velden = array();
  191.  
  192.              /*
  193.             | controleren of de database en het formulier hetzelfde zijn.
  194.             */
  195.             if(!is_array($this->database_velden) || !count($this->database_velden))
  196.             {
  197.                 if(show_errors == true)
  198.                 {
  199.                     /*
  200.                     | Ik heb de Exception methode van PHP gebruikt voor deze foutmelding. Eerst stond er dit
  201.                     | (kun je erin zetten als je dat liever hebt, moet je wel de throw new Exception(...)
  202.                     | weghalen!
  203.                     |
  204.                     | die("FOUT: Geen velden opgegeven");
  205.                     */
  206.                     throw new Exception("De volgende fout is opgetreden: <strong>geen velden opgegeven</strong>.");
  207.                 }
  208.                 else
  209.                 {
  210.                     die("FOUT: Geen velden opgegeven");
  211.                 }
  212.             }
  213.  
  214.             /*
  215.             | De database velden array uit elkaar trekken en gaan controleren op bepaalde zaken
  216.             | zoals lengte van gebruikersnamen.
  217.             */
  218.             foreach($this->database_velden as $veld)
  219.             {
  220.                 /*
  221.                 | Het veld item nog verder uit elkaar halen,
  222.                 | scheiden op alle dubbele punten.
  223.                 */
  224.                 $veld = split(':', $veld);
  225.                
  226.                 /*
  227.                 | De veldnaam ophalen
  228.                 */
  229.                 $veld_naam = $veld[0];
  230.                
  231.                 /*
  232.                 | De velden uit het formulier synchroniseren
  233.                 | met die uit de database.
  234.                 */
  235.                 $velden[$veld_naam] = $_POST[$veld_naam];
  236.            
  237.                 /*
  238.                 | De veld instellingen ophalen
  239.                 */
  240.                 $veld_instellingen = split('\|', $veld[1]);
  241.  
  242.                  /*
  243.                 | De veld instellingen verder uit elkaar halen
  244.                 | om te gaan controleren op lengtes enz.
  245.                 */
  246.                 foreach($veld_instellingen as $instelling)
  247.                 {
  248.                     /*
  249.                     | Als de instelling verplicht is, en het veld is leeg.
  250.                     */
  251.                     if($instelling == 'verplicht' && empty($velden[$veld_naam]))
  252.                     {
  253.                         $this->fouten .= "<li>Het veld '".$veld_naam."' is verplicht, maar nu is het leeg.</li>";
  254.                     }
  255.                    
  256.                     /*
  257.                     | Als de md5 instelling ingeschakeld is, omzetten naar MD5
  258.                     */
  259.                     elseif($instelling == 'md5')
  260.                     {
  261.                         $velden[$veld_naam] = md5($velden[$veld_naam]);
  262.                     }
  263.                    
  264.                     /*
  265.                     | Kijken of er een minimum lengte is
  266.                     */
  267.                     elseif(substr($instelling, 0, 3) == 'min')
  268.                     {
  269.                         /*
  270.                         | En die dan controleren
  271.                         */
  272.                         if(strlen($velden[$veld_naam]) < (int)substr($instelling, 4))
  273.                         {
  274.                             $this->fouten .= "<li>Het veld '".$veld_naam."' is te kort</li>";
  275.                         }
  276.                     }
  277.                    
  278.                     /*
  279.                     | Kijken of er een maxium lengte is
  280.                     */
  281.                     elseif(substr($instelling, 0, 3) == 'max')
  282.                     {
  283.                         /*
  284.                         | En die dan controleren
  285.                         */
  286.                         if(strlen($velden[$veld_naam]) > (int) substr($instelling, 4))
  287.                         {
  288.                             $this->fouten .= "<li>Het veld '".$veld_naam."' is te lang.</li>";
  289.                         }
  290.                     }
  291.                    
  292.                     /*
  293.                     | Kijken of het veld iets moet matchen
  294.                     */
  295.                     elseif(substr($instelling, 0, 2) == "==")
  296.                     {
  297.                         /*
  298.                         | Even kijken of het ook matcht.
  299.                         */
  300.                         if($velden[$veld_naam] != $_POST[substr($instelling, 2)])
  301.                         {
  302.                             $this->fouten .= '<li>Het veld '.$veld_naam.' en '.substr($instelling, 2).' komen niet overeen</li>';
  303.                         }              
  304.                     }
  305.                    
  306.                     /*
  307.                     | Controleren of het veld uniek moet zijn
  308.                     */
  309.                     elseif($instelling == 'uniek')
  310.                     {
  311.                         $q = mysql_query("SELECT ".$veld_naam." FROM gebruikers WHERE ".$veld_naam." = '".mysql_real_escape_string($velden[$veld_naam])."'");
  312.                         if(!$q)
  313.                         {
  314.                             /*
  315.                             | Een verkortte if-else lus.
  316.                             | (wat te controleren) ? uitkomst van if : uitkomst van else
  317.                             */
  318.                             (show_errors == true) ? trigger_error("Er is een MySQL fout opgetreden:<br />".mysql_error(), E_USER_ERROR) : $this->fouten .= '<li>Er is een MySQL fout opgetreden</li>';
  319.                         }
  320.                         else
  321.                         {
  322.                             /*
  323.                             | controleren of het veld al bestaat,
  324.                             */
  325.                             if(mysql_num_rows($q))
  326.                             {
  327.                                 $this->fouten .= '<li>De inhoud van veld '.$veld_naam.' bestaat al</li>';
  328.                             }
  329.                         }      
  330.                     }
  331.                    
  332.                     /*
  333.                     | Controleren of het veld een email adres is
  334.                     */
  335.                     elseif($instelling == 'email')
  336.                     {
  337.                         /*
  338.                         | Controleren of het een geldig email adres is.
  339.                         */
  340.                         if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $velden[$veld_naam]))
  341.                         {
  342.                             $this->fouten .= '<li>Het email adres is niet correct</li>';
  343.                         }
  344.                     }
  345.                 }
  346.             }
  347.            
  348.              /*
  349.             | ALs er geen fouten zijn gevonden in het formulier
  350.             | gaan de de benodigde SQL code genereren.
  351.             */
  352.             if(!$this->fouten)
  353.             {
  354.                 $SQL = "INSERT INTO gebruikers ";
  355.                 $SQL_TMP = '';
  356.                
  357.                 foreach($velden as $naam => $waarde)
  358.                 {
  359.                     $SQL_TMP .= ", ".$naam." = '".mysql_real_escape_string($waarde)."'";
  360.                 }  
  361.                
  362.                 $SQL .= "SET ".preg_replace("#^,{0,1}#", '', $SQL_TMP);
  363.                
  364.                 /*
  365.                 | De query is gelukt, nu de gebruiker terug bregen naar de index
  366.                 */
  367.                 if($SQL_TMP && mysql_query($SQL))
  368.                 {
  369.                     header("Location: index.php");
  370.                 }
  371.                
  372.                 /*
  373.                 | Anders een fout tonen.
  374.                 */
  375.                 else
  376.                 {
  377.                     (show_errors == true) ? trigger_error("Er is een MySQL fout opgetreden:<br />".mysql_error(), E_USER_ERROR) : $this->fouten .= '<li>Er is een MySQL fout opgetreden</li>';
  378.                 }
  379.             }      
  380.         }
  381.    
  382.     }
  383.    
  384.     /*
  385.     | Een functie om de gegeven van de gebruikers die in willen loggen te controleren.
  386.     */
  387.     private function controleer_gegevens()
  388.     {
  389.         /*
  390.         | Het actie veld is gezet en de waarde is ook goed
  391.         */
  392.         if(isset($_POST['actie']) && $_POST['actie'] == "login")
  393.         {
  394.             /*
  395.             | Even de gebruikersnaam en wachtwoord beveiligen
  396.             | voordat we deze in de database gooien
  397.             */
  398.             $gebruiker = mysql_real_escape_string($_POST['gebruikersnaam']);
  399.             $wachtwoord = mysql_real_escape_string($_POST['wachtwoord']);
  400.            
  401.             /*
  402.             | Als je in config.php hebt ingesteld dat wachtwoorden
  403.             | gecodeerd moeten worden moet MD5, dan doen we dat hier
  404.             */
  405.             if(login_password_md5 === true)
  406.             {
  407.                 $wachtwoord = md5($wachtwoord);
  408.             }
  409.            
  410.             /*
  411.             | Een query uitvoeren om te kijken of de gebruiker in de database zit
  412.             */
  413.             $query = mysql_query("SELECT * FROM gebruikers WHERE gebruikersnaam = '".$gebruiker."' AND wachtwoord = '".$wachtwoord."'");
  414.            
  415.             /*
  416.             | Als dat zo is moet de gebruikersinfo array gevuld worden met informatie,
  417.             | en er moet een sessie gestart worden.
  418.             */
  419.             if(mysql_num_rows($query))
  420.             {
  421.                 self::$gebruikersinfo = array();
  422.                 self::$gebruikersinfo['info'] = mysql_fetch_array($query);
  423.                 return $this->start_session();
  424.             }
  425.            
  426.             /*
  427.             | De gebruiker zit niet in de database. Fout laten zien dan maar
  428.             */
  429.             else
  430.             {
  431.                 /*
  432.                 | Als er een MySQL fout is deze tonen (of niet, ligt aan je config.php)
  433.                 | Is dat niet zo, dan is of de gebruikersnaam of het wachtwoord
  434.                 | fout.
  435.                 */
  436.                 if(mysql_error())
  437.                 {
  438.                     (show_errors == true) ? trigger_error("Er is een MySQL fout opgetreden:<br />".mysql_error(), E_USER_ERROR) : $this->fouten = "Er is een MySQL fout opgetreden";
  439.                 }
  440.                 else
  441.                 {
  442.                     $this->fouten = "Gebruikersnaam/wachtwoord niet correct.";
  443.                 }
  444.             }
  445.         }
  446.     }
  447.    
  448.     /*
  449.     | Een functie om te kijken of de gebruiker al is ingelogd.
  450.     */
  451.     private function check_session()
  452.     {
  453.         /*
  454.         | kijken of de recheck variabele van daarstraks niet
  455.         | te groot is geworden.
  456.         | Is dat wel zo dan een foutmelding laten zien en
  457.         | 'false' retourneren.
  458.         */
  459.         if($this->recheck >= 3)
  460.         {
  461.             $this->fouten = "Er is een ongeldige sleutel gevonden.";
  462.             return false;
  463.         }
  464.        
  465.         /*
  466.         | als de cookie (sid) is gezet en NIET leeg is
  467.         | even controleren of de sleutel uit de cookie
  468.         | klopt met die uit de database (als die er
  469.         | al instaat om mee te beginnen)
  470.         |
  471.         | Is dat zo dan word self::$loginsessie waar en
  472.         | word self::$gebruikersinfo['info'] met de juiste
  473.         | velden gevuld
  474.         |
  475.         | Zo niet, dan word $this->recheck een groter
  476.         */
  477.         if(isset($_COOKIE['sid']) && !empty($_COOKIE['sid']))
  478.         {
  479.             $sid = mysql_real_escape_string($_COOKIE['sid']);
  480.             $query = mysql_query("SELECT * FROM logins WHERE sid = '".$sid."' AND ip = '".$this->get_ip()."'") or die(mysql_error());
  481.             if(mysql_num_rows($query))
  482.             {
  483.                 #$f = mysql_fetch_array($query);
  484.                 $f = mysql_fetch_object($query);
  485.                 $query = mysql_query("SELECT * FROM gebruikers WHERE id = '".$f->uid."'") or die(mysql_error());
  486.                 if(mysql_num_rows($query))
  487.                 {
  488.                     self::$loginsessie = true;
  489.                     self::$gebruikersinfo = array();
  490.                     self::$gebruikersinfo['info'] = mysql_fetch_array($query);
  491.                 }
  492.             }
  493.         }
  494.         else
  495.         {
  496.             $secondes = login_session_time * 3600;
  497.             setcookie("sid", "", time()-$secondes, "/");
  498.             $this->recheck = $this->recheck + 1;
  499.         }
  500.     }
  501.    
  502.     /*
  503.     | De sessie die hierboven word besproken starten, de correcte informatie
  504.     | in de database opslaan ,een cookie maken en de gebruiker terugleiden
  505.     | naar waar hij/zij vandaan kwam.
  506.     */
  507.     private function start_session()
  508.     {
  509.         self::$gebruikersinfo['sleutel'] = md5(rand(0,99999999999).date("dmyhis"));
  510.         $info = self::$gebruikersinfo['info'];
  511.         $SQL  = "INSERT INTO logins ";
  512.         $SQL .= "SET uid    = '". mysql_real_escape_string($info['id']) ."' ";
  513.         $SQL .= ",   sid   = '". mysql_real_escape_string(self::$gebruikersinfo['sleutel']) ."' ";
  514.         $SQL .= ",   ip = '". mysql_real_escape_string($this->get_ip()) ."' ";
  515.         $SQL .= ",   datum = NOW() ";
  516.         mysql_query($SQL) or die("Error: kon niet inloggen.");
  517.         $secondes = login_session_time * 3600;
  518.         setcookie("sid", self::$gebruikersinfo['sleutel'], time()+$secondes, "/");
  519.         header("Location: ".$_SERVER['REQUEST_URI']);
  520.     }
  521.    
  522.     /*
  523.     | Een functie om de sessie die hierboven besproken word te stoppen, en de
  524.     | informatie uit de database te halen, de cookie te vernietigen en de
  525.     | gebruiker terug te leiden naar waar hij/zij vandaan kwam.
  526.     */
  527.     private function end_session()
  528.     {
  529.         mysql_query("DELETE FROM logins WHERE sid = '".$_COOKIE['sid']."' AND ip = '".$this->get_ip()."'") or die(mysql_error());
  530.         $secondes = login_session_time * 3600;
  531.         setcookie("sid", "", time()-$secondes, "/");
  532.         $url = str_replace("?actie=uitloggen", "", $_SERVER['REQUEST_URI']);
  533.         header("Location: ".$url);
  534.     }
  535.    
  536.     /*
  537.     | De functie om gebruikers informatie op te halen en te controleren
  538.     | of de gebruikers ingelogd is.
  539.     */
  540.     public static function get_login_info($wat=false)
  541.     {
  542.         /*
  543.         | Als de gebruikers niet is ingelogd 'false' retourneren.
  544.         */
  545.         if(!self::$loginsessie || !count(self::$gebruikersinfo))
  546.         {
  547.             return false;
  548.         }
  549.        
  550.         /*
  551.         | Anders even wat controles uitvoeren wat er moet gebeuren
  552.         */
  553.         else
  554.         {
  555.             /*
  556.             | Alles van de gebruiker laten zien
  557.             */
  558.             if($wat === 'alles')
  559.             {
  560.                 return self::$gebruikersinfo['info'];
  561.             }
  562.            
  563.             /*
  564.             | Een specefiek veld van de gebruiker laten zien
  565.             */
  566.             elseif(isset(self::$gebruikersinfo['info'][$wat]))
  567.             {
  568.                 return self::$gebruikersinfo['info'][$wat];
  569.             }
  570.            
  571.             /*
  572.             | Anders true retourneren (zie eerste if() lus van deze functie)
  573.             */
  574.             else
  575.             {
  576.                 return true;
  577.             }
  578.         }
  579.     }
  580. }
  581.  
  582. /*
  583. | Meteen maar een nieuwe instantie van deze klasse maken en meteen de __constructor() functie laden
  584. | (in dit geval dus login(), de naam word door PHP bepaald aan de hand van de klasse naam)
  585. */
  586. $login = new login();
  587.  
  588. /*
  589. | De benodigde database velden instellen
  590. | Elk veld dat je bij het registeren wilt hebben kan je hier toevoegen als nieuwe array waarde.
  591. | De syntax is: 'veldnaam:flag1|flag2'
  592. | Het veldnaam en de flags scheid je met dubbele punt. De flags scheid je van elkaar met een verticaal streepje.
  593. |
  594. | Flags:
  595. |   verplicht   = maak het veld verplicht
  596. |   uniek       = De ingevulde waarde voor dit veld mag maar een keer gebruikt worden. (handig voor gebruikersnamen)
  597. |   min=3       = Minimaal in te vullen karakters is in dit geval 3.
  598. |   max=10      = Maximaal in te vullen karakters is in dit geval 10.
  599. |   ==wachtwoord2   = De ingevulde waarde van het huidge veld moet overeen komen met in dit geval de inhoud van het veld 'wachtwoord2'
  600. |   email       = Er wordt gecontrolleerd of de ingevulde waarde voldoet aan de eisen van een geldig e-mailadres.
  601. |   md5     = Codeer de ingevulde waarde naar md5.
  602. */
  603. $login->database_velden = $database_velden;
  604.  
  605. /*
  606. | En de init functie aanroepen
  607. */
  608. $login->init();
  609. ?>


9. Databasevelden
Dit inlogsysteem bied de mogelijkheid om vrij dynamisch database velden toe te voegen. Wil je bijvoorbeeld een veld erbij voor een e-mailadres, dan hoef je het veld alleen in de database te maken, en op te geven in de configuratie. In de configuratie kan je in de array het veld toevoegen en de benodige flags geven. Meer uitleg over de flags vind je in de config.

Als voorbeeld willen we een gebruikersnaam, wachtwoord en e-mailadres. Het wachtwoord gaan we coderen naar md5. Let op! Voor md5 moet je de optie in de configuratie ook op true zetten.

Plaats in de config de volgende code erbij (onder $database_velden = array()). Let wel op, er staan er al twee. Zorg dat je ze niet dubbel plaatst.

Plain | Plain new window | PHP code:
  1. array_push($database_velden, 'gebruikersnaam:verplicht|uniek|min=3|max=15');
  2. array_push($database_velden, 'wachtwoord:verplicht|min=3|max=10|md5|==wachtwoord2');
  3. array_push($database_velden, 'email:verplicht|email');

Het email veld wordt nu gecontrolleerd of het een geldig e-mailadres is, en of het veld is ingevuld. Het gebruikersnaamveld is verplicht, moet uniek zijn en heeft een minimum en maximum aantal karakters nodig. Hetzelfde geldt voor het wachtwoord veld, echter hebben we daar nog de optie md5 aan toegevoegd, en we willen dat het gelijk is aan het veld wachtwoord2.

Tot slot
Dit systeem is voor gevorden, omdat OOP mogelijk vrij lastig te begrijpen. Maar omdat het erg simpel in gebruik is, kunnen beginners het natuurlijk ook gebruiken.
Het maken van een wachtwoord vergeten functie is ook niet zo moeilijk, misschien dat ik die uitbreiding later maak.

Downloaden als: (zip)

Lees de forum regels

Ricardo
member
avatar
# Gepost op 11-08-2009 19:57


Netjes! Ik heb nog niet helemaal goed naar de script gekeken, maar jou kennende is dat gewoon goed.;)

Groeten,
Ricardo

TijmenD
member
avatar
# Gepost op 12-08-2009 15:52


Dit gaat echt boven mijn petje.
Ik zal het es een keer doornemen als ik zin heb om OOP te willen begrijpen.

Hihi.

vlerknozem
Admin
avatar
# Gepost op 13-08-2009 12:45
Bewerkt door vlerknozem op 13-08-2009 12:45


Ik heb een kleine update gedaan. Op html-site.nl had de gebruiker Eleky wat problemen met dit systeem. Ik kwam er net achter dat er in ieder geval een probleem was met de cookies. Als er een ongeldige cookie is, dan zal je dus niet kunnen inloggen. Deze update verwijderd deze ongeldige cookie eerst en doet daarna de check overnieuw (maximaal drie keer om een lus te voorkomen).

De update is ook verwerkt in de downloads.

Lees de forum regels

superkluns
Tester
avatar
# Gepost op 02-09-2009 17:15


misschien een beetje late reactie, maar wat heb je allemaal verandert? als ik je code nu gewoon weer overcopieer zal het wel werken, alleen ik heb ook de nodige veranderingen gedaan, dus dan gaan die van mij verloren..

Oja, en ik heb op html-site een nieuwe reactie met een verbetering waar je (n)iets meet kunt doen

sebastiaan
member
avatar
# Gepost op 04-01-2010 00:45


Ik heb een 'update' gemaakt voor je login systeem. Voor het complete verhaal (wil niet dat hele verhaal WEER typen) zie :

http://www.html-site.nl/forum/24_20196_3.html#25

Mijn software heeft geen bugs. Het ontwikkelt gewoon ongedocumenteerde functies.

vlerknozem
Admin
avatar
# Gepost op 04-01-2010 11:03
Bewerkt door vlerknozem op 04-01-2010 11:28


Nice :)

Maar je throw exception gaf problemen. Wist zo snel even niet waarom, dus heb dat aangepast naar trigger_error. Ook heb ik nog andere fouten verbeterd.

Lees de forum regels

sebastiaan
member
avatar
# Gepost op 05-01-2010 15:00


Citaat van vlerknozem
Maar je throw exception gaf problemen. Wist zo snel even niet waarom, dus heb dat aangepast naar trigger_error. Ook heb ik nog andere fouten verbeterd.

Heb ik gemerkt ja, daarom hen ik mijn update geupdate.. Zie link naar html-site ;-)

Mijn software heeft geen bugs. Het ontwikkelt gewoon ongedocumenteerde functies.

vlerknozem
Admin
avatar
# Gepost op 07-01-2010 20:02


Versie 2.3
- Mogelijkheid erbij om login::get_login_info() te gebruiken, is nu static.
- $login->database_velden array vanaf nu in de config aan te passen
- Betere uitleg bij de database velden (in de config)

Lees de forum regels

Kriebel
member
avatar
# Gepost op 07-08-2010 15:04
Bewerkt door Kriebel op 07-08-2010 15:04


Haai, ik heb een vraagje: bij mij gaat het uitloggen niet goed. Als ik me heb ingelogd, komt er "welkom.. " enz te staan, als ik dan op uitloggen druk krijg ik de indexpagina (die bij mij gewoon een echo output geeft). Als ik echter daarna weer opnieuwe http://localhost...proberen.php intik, dan krijg ik dat ik nog steeds ingelogd ben.
De volgende bestanden heb ik gewoon gekopieert:
header.php
config.php
login.inc.php
En dat wat er stond bij punt 5 noemde ik proberen.php

Hopelijk kan je me vertellen wat er mis gaat

vlerknozem
Admin
avatar
# Gepost op 07-08-2010 16:10


Hallo Kriebel, welkom op het forum!

Je krijgt geen foutmeldingen? Als je uitlogt is de cookie dan ook leeg of weg? En ben je wel uitgelogd na een refresh?

Heb je het misschien online staan? Dan kan ik even kijken wat het doet.

Lees de forum regels

Kriebel
member
avatar
# Gepost op 07-08-2010 16:38


haai,

Nee, ik heb het jammer genoeg niet online staan.
Ik krijg geen foutmelding en ik ben ook niet uitgelogd na een refresh.
Pas als ik de entrys verwijder in de tabel logins en dan opnieuw http://localhost... enz invoer kan ik me opnieuw inloggen...

Kriebel
member
avatar
# Gepost op 07-08-2010 17:13


Ben ik iets vergeten te kopieren naast die 4 ?

vlerknozem
Admin
avatar
# Gepost op 08-08-2010 20:58


Misschien dat de end_session functie niet wordt aangeroepen. Dan zou ?actie=uitloggen waarschijnlijk ook in de url blijven staan. Dan zou de cookie waarschijnlijk ook blijven bestaan. Dit kan je testen door er een 'test' echo in te plaatsen. Heb je hetzelfde probleem als je het zipje download en precies op die manier test?

Volgens mij ben je geen bestanden vergeten.

Lees de forum regels

sebastiaan
member
avatar
# Gepost op 23-08-2010 12:56
Bewerkt door sebastiaan op 23-08-2010 13:04


Ik heb een update voor dit systeem gemaakt. Het scheid de registratielogica van de loginlogica. De registratie zit nu in zijn eigen klasse. Verder veranderd er niets.

http://sckripts.nl/forum/T103/Tutorials/PHP-Registratieklasse/

Mijn software heeft geen bugs. Het ontwikkelt gewoon ongedocumenteerde functies.

Vorige ( 1,2 ) Volgende

U moet aangemeld zijn om een reactie te kunnen plaatsen.

Indien u nog geen account heeft kunt u zich hier registreren.



© copyright 2009/2010 WebProjects 1.02 - Template van Sebastaan Franken