Foutafhandeling

Uit PHPWiki

Ga naar: navigatie, zoeken

Foutafhandeling. Een van de belangrijkste onderdelen van een PHP script. Door middel van een goede foutafhandeling kun je precies zien wat er verkeerd gaat en waar dat verkeerd gaat, terwijl een bezoeker nette meldingen te zien krijgt waar een hacker geen informatie uit kan halen. Ik ga er vanuit dat je de Debug constante gebruikt.

Queries

Heel vaak wordt er vanuit gegaan dat een query die uitgevoerd wordt wel lukt, maar niets is minder waar. Meestal zal je query lukken, maar lang niet altijd. We moeten dus gaan controleren of een query wel gelukt is. Een voorbeeldje van het invoegen van een nieuwe gebruiker in een fictief registratie systeem:

  1. <?php
  2. $sql = "
  3. INSERT INTO gebruikers
  4. (
  5. gebruikersnaam,
  6. wachtwoord,
  7. registratiedatum
  8. )
  9. VALUES
  10. (
  11. '".mysql_real_escape_string($_POST['gebruikersnaam'])."',
  12. '".md5($_POST['wachtwoord'])."',
  13. NOW()
  14. )";
  15.  
  16. if(!($result = mysql_query($sql))
  17. {
  18. echo 'Helaas is er een fout opgetreden bij het registreren'
  19.  
  20. if(DEBUG == true)
  21. {
  22. echo ': ' . mysql_errno() . ':' . mysql_error() . '(<pre>' . $sql . '</pre>)';
  23. }
  24. }
  25. else
  26. {
  27. echo 'Je bent geregistreerd';
  28. }
  29. ?>

We geven de bezoeker hier dus een foutmelding met wat er verkeerd is gegaan. Wanneer DEBUG op 1 staat krijgen we ook nog het errornummer en de error melding te zien.

Ditzelfde principe kunnen we toepassen op een SELECT query en een UPDATE query:

  1. <?php
  2. $sql = "
  3. SELECT
  4. registratiedatum
  5. FROM
  6. gebruikers
  7. WHERE
  8. id = 1
  9. ";
  10.  
  11. if(!$result = mysql_query($sql))
  12. {
  13. echo 'Helaas is er een fout opgetreden bij het ophalen van de gegevens';
  14.  
  15. if(DEBUG == true)
  16. {
  17. echo ': ' . mysql_errno() . ':' . mysql_error() . '(<pre>' . $sql . '</pre>)';
  18. }
  19. }
  20. elseif(mysql_num_rows() != 1)
  21. {
  22. echo 'Helaas is er een fout opgetreden bij het ophalen van de gegevens.';
  23.  
  24. if(DEBUG == true)
  25. {
  26. echo ' Het aantal rijen dat opgehaald is is '.mysql_num_rows().' terwijl er 1 rij was verwacht. (<pre>' . $sql . '</pre>)';
  27. }
  28. }
  29. else
  30. {
  31. $data = mysql_fetch_assoc($result);
  32. }
  33. ?>

En voor de UPDATE query:

  1. <?php
  2. $sql = "
  3. UPDATE
  4. gebruikers
  5. SET
  6. wachtwoord = '".md5($_POST['wachtwoord'])."'
  7. WHERE
  8. id = 1
  9. ";
  10.  
  11. if(!$result = mysql_query($sql))
  12. {
  13. echo 'Helaas is er een fout opgetreden bij het wijzigen van het wachtwoord';
  14.  
  15. if(DEBUG == true)
  16. {
  17. echo ': ' . mysql_errno() . ':' . mysql_error() . '(<pre>' . $sql . '</pre>)';
  18. }
  19. }
  20. elseif(mysql_affected_rows() != 1)
  21. {
  22. echo 'Het wachtwoord is niet gewijzigd.';
  23.  
  24. if(DEBUG == true)
  25. {
  26. echo ' Deze gebruiker bestaat niet'; //Er vanuit gaande dat id UNIQUE is
  27. }
  28. }
  29. else
  30. {
  31. echo 'Het wachtwoord is veranderd';
  32. }
  33. ?>

Een DELETE query spreekt voor zich nu denk ik.

Die()

Vaak zie je het volgende:

 
$result = mysql_query($query) or die (mysql_error());
 

die() is echter een functie die je niet wilt gebruiken in deze situatie. Een query mislukt. Dat kan gebeuren. die() stopt het laden van de pagina en alle PHP en HTML die onder de die() staat wordt niet meer uitgevoerd. Dat betekent dus dat je HTML niet meer afgesloten wordt en dat je bijvoorbeeld alleen de header van je website met een uit elkaar gerukt content gedeelte ziet staan. Dat is natuurlijk geen situatie die je aan je bezoekers wilt voorschotelen. Gebruik daarom een foutafhandeling zoals hierboven beschreven.

Zie ook