# Gepost op 09-08-2009 14:21
Bewerkt door vlerknozem op 09-08-2009 14:26
Bewerkt door vlerknozem op 09-08-2009 14:26
Het is altijd mogelijk dat er een fout optreed in je website. Er zijn een aantal verschillende foutmeldingen. Naast de foutmeldingen van PHP zelf, heb je ook mysql errors, en je kunt zelf je eigen fouten maken. Maar het is natuurlijk vervelend om de bezoeker op te schepen met een lelijke foutmelding waarmee je de bezoeker alleen maar afschrikt. In deze tutorial wil ik meerdere dingen uitleggen:
1. De werking van error reporting
2. De soorten foutmeldingen
3. MySQL errors
4. Het maken van eigen fouten
5. Fouten netjes afhandelen
6. Fouten opslaan naar een logbestand.
1. De werking van error reporting
Standaard zal PHP de grote fouten (errors) weergeven, en het script afbreken. Dit is vaak noodzakelijk omdat je met een 'kapot' script weinig kan. Minder erge fouten (warnings) zal PHP ook weergeven, maar het script wordt dan niet afgebroken. Ook zijn er meldingen die niet belangrijk zijn, maar eerder wijzen op een slordigheids foutje van de programmeur.
Sommige hosts hebben error reporting helemaal uitgeschakeld. In sommige gevallen wil je dat het wel aan staat, en daarvoor kan je dit gebruiken:
2. De soorten foutmeldingen
Om de tutorial kort en krachtig te houden ga ik deze soorten niet bespreken. Ik verwijs naar de documentatie van php.net.
http://nl2.php.net/manual/en/errorfunc.constants.php
Even in het kort. De soorten die beginnen met E_USER zijn door de gebruiker zelf gegeneerd met behulp van trigger_error(). De overige niet.
3. MySQL errors
MySQL heeft zelf ook fouten. Standaard zie je alleen een fout die niet zoveel zegt over wat er echt mis is. Om erachter te komen wat er echt mis is kan je de functie mysql_error() gebruiken. Bijvoorbeeld:
De 'or' spreekt voor zich. De die() breekt het script af, en weergeeft de mysql error.
4. Het maken van eigen fouten
In alinea 2 heb ik al iets verteld over trigger_error en E_USER. Hiermee kan je dus zelf je eigen fouten maken. Het prinicipe is simpel.
De E_USER_ERROR doet dus het zelfde als E_ERROR, alleen is deze door het script zelf getriggerd.
5. Fouten netjes afhandelen
Als je geen lelijke error op je site wil, maar in plaats daarvan je eigen melding kan je hetvolgende script gebruiken:
Ik heb nu twee voorbeelden gegeven. Dat moet al een deel verklaren. De 'return true' in de functie zegt dat PHP zich verder niet meer moet bemoeien met die fout. Als je 'return false' gebruikt of niks, dan zal PHP gewoon de standaard error afhandeling vervolgen.
De 'break' is om de 'case' te stoppen. Doe je dat niet, dan zal php doorgaan naar de volgende 'case'. In dit geval is de break overbodig omdat in beide gevallen de functie sowieso niet meer verder gaat door een die of return.
6. Fouten opslaan naar een logbestand
Als bij de bezoeker een fout optreed, is het handig voor de webmaster om te weten welke fout er heeft opgetreden. Daarom maak ik een simpele functie om te loggen.
De testquery is goed, alleen heb ik geen verbinding met de database. Daarom krijg ik een fout. Open je het logbestand, dan ziet het er zo uit:
Wil je een per maand een nieuw logbestand, kan je natuurlijk de datum in de bestandsnaam verwerken. Bijvoorbeeld:
Dan krijg je iedere maand een nieuw logbestand. Een bestandsnaam wordt dan bijvoorbeeld: 'log.Aug-2009.php'. Eventueel zou je nog kunnen zorgen dat logbestanden van een jaar oud automatisch worden verwijderd.
1. De werking van error reporting
2. De soorten foutmeldingen
3. MySQL errors
4. Het maken van eigen fouten
5. Fouten netjes afhandelen
6. Fouten opslaan naar een logbestand.
1. De werking van error reporting
Standaard zal PHP de grote fouten (errors) weergeven, en het script afbreken. Dit is vaak noodzakelijk omdat je met een 'kapot' script weinig kan. Minder erge fouten (warnings) zal PHP ook weergeven, maar het script wordt dan niet afgebroken. Ook zijn er meldingen die niet belangrijk zijn, maar eerder wijzen op een slordigheids foutje van de programmeur.
Sommige hosts hebben error reporting helemaal uitgeschakeld. In sommige gevallen wil je dat het wel aan staat, en daarvoor kan je dit gebruiken:
- <?php
- // Zet error reporting aan. Weergeef alle meldingen, behalve E_NOTICE.
- // Zet error reporting aan in de ini.
- ?>
2. De soorten foutmeldingen
Om de tutorial kort en krachtig te houden ga ik deze soorten niet bespreken. Ik verwijs naar de documentatie van php.net.
http://nl2.php.net/manual/en/errorfunc.constants.php
Even in het kort. De soorten die beginnen met E_USER zijn door de gebruiker zelf gegeneerd met behulp van trigger_error(). De overige niet.
3. MySQL errors
MySQL heeft zelf ook fouten. Standaard zie je alleen een fout die niet zoveel zegt over wat er echt mis is. Om erachter te komen wat er echt mis is kan je de functie mysql_error() gebruiken. Bijvoorbeeld:
- <?php
- ?>
De 'or' spreekt voor zich. De die() breekt het script af, en weergeeft de mysql error.
4. Het maken van eigen fouten
In alinea 2 heb ik al iets verteld over trigger_error en E_USER. Hiermee kan je dus zelf je eigen fouten maken. Het prinicipe is simpel.
- <?php
- ?>
De E_USER_ERROR doet dus het zelfde als E_ERROR, alleen is deze door het script zelf getriggerd.
5. Fouten netjes afhandelen
Als je geen lelijke error op je site wil, maar in plaats daarvan je eigen melding kan je hetvolgende script gebruiken:
- <?php
- function error_handler( $soort, $errorstring, $bestand, $regel) {
- // Kijken naar het soort
- switch($soort) {
- case E_ERROR:
- // Foutmelding
- $fout = "Er is een fout opgetreden op regel <b>".$regel."</b> in het bestand \"". $bestand."\": ";
- $fout .= "<p>". $errorstring ."</p>";
- // Afhandelen
- break;
- case E_WARNING:
- // Foutmelding
- echo "Er is een fout opgetreden op regel <b>".$regel."</b> in het bestand \"". $bestand."\": ";
- // Afhandelen
- return true;
- break;
- }
- }
- // Error handler installeren
- ?>
Ik heb nu twee voorbeelden gegeven. Dat moet al een deel verklaren. De 'return true' in de functie zegt dat PHP zich verder niet meer moet bemoeien met die fout. Als je 'return false' gebruikt of niks, dan zal PHP gewoon de standaard error afhandeling vervolgen.
De 'break' is om de 'case' te stoppen. Doe je dat niet, dan zal php doorgaan naar de volgende 'case'. In dit geval is de break overbodig omdat in beide gevallen de functie sowieso niet meer verder gaat door een die of return.
6. Fouten opslaan naar een logbestand
Als bij de bezoeker een fout optreed, is het handig voor de webmaster om te weten welke fout er heeft opgetreden. Daarom maak ik een simpele functie om te loggen.
- <?php
- function writelog($msg) {
- // Kijken of de map bestaat.
- $lstring = "";
- // Kijken of het logbestand bestaat
- // Nee dus.
- // Maak een exit code om te voorkomen dat bezoekers het bestand kunnen lezen.
- $lstring = "<?php\nexit;\n?>\n";
- }
- // Bestand openen, indien het bestand niet bestaat de proberen aan te maken. Let op voor de juiste rechten in de map! (of maak het bestand handmatig aan met
- // de juiste rechten.
- // Logstring maken.
- // Logstring schrijven
- // Logbestand sluiten
- } else {
- }
- } else {
- }
- }
- function error_handler( $soort, $errorstring, $bestand, $regel) {
- // Foutmeldingen maken
- $fout_log = '[regel: '. $regel.'] [url: '. $_SERVER['REQUEST_URI'].'] [bestand: '. $bestand.']: '.$errorstring;
- $fout_gasten = 'Er is een interne fout opgetreden. Onze excuses voor dit ongemak.';
- // Alle fouten naar het log bestand schrijven. Wil je niet alle meldingen loggen, dan kan je dit in de switch bij de juiste cases zetten.
- writelog($fout_log);
- // Kijken naar het soort
- switch($soort) {
- // Errors
- case E_ERROR:
- case E_USER_ERROR:
- // Weergeven en sterven
- // Waarschuwingen
- case E_WARNING:
- case E_USER_WARNING:
- // Weergeven
- echo $fout;
- break;
- }
- // Zorgen dat PHP niks meer doet met deze meldingen
- return true;
- }
- // Error handler installeren
- // Een test. Ik ga ervan uit dat je hier een database connectie hebt :
- ?>
De testquery is goed, alleen heb ik geen verbinding met de database. Daarom krijg ik een fout. Open je het logbestand, dan ziet het er zo uit:
Plain | Plain new window | code:
- <?php
- exit;
- ?>
- [09-08-2009 14:05:08] [127.0.1.1] [regel: 66] [url: /~koen/Test/error-log.php] [bestand: /var/www/Users/koen/public_html/Test/error-log.php]: mysql_query() [<a href='function.mysql-query'>function.mysql-query</a>]: Access denied for user 'www-data'@'localhost' (using password: NO)
- [09-08-2009 14:05:08] [127.0.1.1] [regel: 66] [url: /~koen/Test/error-log.php] [bestand: /var/www/Users/koen/public_html/Test/error-log.php]: mysql_query() [<a href='function.mysql-query'>function.mysql-query</a>]: A link to the server could not be established
- [09-08-2009 14:05:08] [127.0.1.1] [regel: 66] [url: /~koen/Test/error-log.php] [bestand: /var/www/Users/koen/public_html/Test/error-log.php]: Access denied for user 'www-data'@'localhost' (using password: NO)
Wil je een per maand een nieuw logbestand, kan je natuurlijk de datum in de bestandsnaam verwerken. Bijvoorbeeld:
Dan krijg je iedere maand een nieuw logbestand. Een bestandsnaam wordt dan bijvoorbeeld: 'log.Aug-2009.php'. Eventueel zou je nog kunnen zorgen dat logbestanden van een jaar oud automatisch worden verwijderd.
Lees de forum regels