PHP Foutafhandeling

In PHP, the default error handling is simple. A message is sent to the browser, which contains the filename, line number, and a description of the error.

PHP Foutafhandeling

Bij het maken van scripts en webapplicaties is foutafhandeling een belangrijk onderdeel. Als je code ontbreekt aan foutdetectie codage, ziet je programma er onprofessioneel uit en opent het deuren voor beveiligingsrisico's.

Deze handleiding bespreekt enkele van de belangrijkste foutdetectiemethoden in PHP.

We zullen verschillende foutafhandeling methoden uitleggen:

  • Eenvoudige "die()" statement
  • Aangepaste fouten en fout triggers
  • Foutmelding

Basis foutafhandeling: gebruik van de die() functie

Een eenvoudige script om een tekstbestand te openen:

<?php
$file=fopen("welcome.txt","r");
?>

Als het bestand niet bestaat, krijg je een fout zoals deze:

Waarschuwing: fopen(welcome.txt) [function.fopen]: kan stroom niet openen: 
Geen dergelijk bestand of directory in C:\webfolder\test.php op regel 2

Om ervoor te zorgen dat de gebruiker geen foutmelding zoals hierboven krijgt, controleren we of het bestand bestaat voordat we het bestand bereiken:

<?php
if(!file_exists("welcome.txt"))
 {
 die("Bestand niet gevonden");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

Nu, als het bestand niet bestaat, krijg je een foutmelding zoals deze:

Bestand niet gevonden

In vergelijking met de vorige code is de bovenstaande code effectiever, omdat het een eenvoudige foutafhandeling mechanisme gebruikt om het script na een fout te beëindigen.

Echter, het eenvoudig afbreken van het script is niet altijd de juiste manier. Laten we eens kijken naar alternatieve PHP-functies voor foutafhandeling.

Maak een aangepaste foutafhandelaar

Het maken van een aangepaste foutafhandelaar is zeer eenvoudig. We hebben eenvoudig een specifieke functie gemaakt die kan worden aangeroepen wanneer er een fout optreedt in PHP.

Deze functie moet in staat zijn ten minste twee parameters te verwerken (foutniveau en foutmelding), maar kan maximaal vijf parameters accepteren (optioneel: bestand, lijnnummer en foutcontext):

Syntaxis

error_function(error_level, error_message,
error_file, error_line, error_context)
Parameter Beschrijving
error_level

Verplicht. Definieerde fouten moeten foutmeldingsniveaus hebben. Dit moet een waarde zijn.

Zie onderstaande tabel: foutmeldingsniveaus.

error_message Verplicht. Definieerde foutmeldingen voor gebruikersopgegeven fouten.
error_file Optioneel. Specificeer de naam van het bestand waarin de fout is opgetreden.
error_line Optioneel. Specificeer de regelnummer waarop de fout is opgetreden.
error_context Optioneel. Specificeer een array die bestaat uit alle variabelen en hun waarden die in gebruik zijn wanneer een fout optreedt.

Foutmeldingsniveau

Deze foutmeldingsniveaus zijn verschillende typen fouten die de foutafhandelingsschilder moet verwerken:

Waarde Constante Beschrijving
2 E_WARNING Niet-fatale run-time fouten. Ze onderbreeken de uitvoering van het script niet.
8 E_NOTICE

Run-time meldingen.

De script ontdekt dat er mogelijk fouten zijn opgetreden, maar deze kunnen ook optreden tijdens de normale uitvoering van het script.

256 E_USER_ERROR Fatale fouten gegenereerd door gebruikers. Ze zijn vergelijkbaar met E_ERROR, die door programmeurs worden ingesteld met behulp van de PHP-functie trigger_error().
512 E_USER_WARNING Niet-fatale waarschuwingen gegenereerd door gebruikers. Ze zijn vergelijkbaar met E_WARNING, die door programmeurs worden ingesteld met behulp van de PHP-functie trigger_error().
1024 E_USER_NOTICE Door gebruikers gegenereerde meldingen. Ze zijn vergelijkbaar met E_NOTICE, die door programmeurs worden ingesteld met behulp van de PHP-functie trigger_error().
4096 E_RECOVERABLE_ERROR Zeer ernstige fouten die kunnen worden opgevangen. Ze zijn vergelijkbaar met E_ERROR, maar kunnen worden opgevangen door een door de gebruiker gedefinieerde schilder. (Zie set_error_handler()).
8191 E_ALL

Alle fouten en waarschuwingen, behalve op niveau E_STRICT.

(In PHP 6.0 is E_STRICT onderdeel van E_ALL)

Laat ons nu een foutafhandelingsschilder maken:

function customError($errno, $errstr)
 { 
 echo "<b>Fout:</b> [$errno] $errstr<br />";
 echo "Einde Script";
 die();
 }

Het bovenstaande code is een eenvoudige foutafhandelingsschilder. Wanneer deze wordt geactiveerd, haalt hij het foutniveau en het foutbericht op. Vervolgens geeft hij het foutniveau en het bericht weer en stopt het script.

Nu dat we een foutafhandelingsschilder hebben gemaakt, moeten we bepalen wanneer deze functie wordt geactiveerd.

Set Error Handler

De standaard foutafhandelingsschilder van PHP is de ingebouwde foutafhandelingsschilder. We willen de functie hierboven aanpassen tot de standaard foutafhandelingsschilder tijdens de scriptuitvoering.

Je kunt de foutafhandelingsschilder aanpassen zodat deze alleen van toepassing is op bepaalde fouten, zodat het script verschillende manieren kan gebruiken om verschillende fouten te verwerken. Echter, in dit voorbeeld willen we onze aangepaste foutafhandelingsschilder gebruiken voor alle fouten:

set_error_handler("customError");

Omdat we willen dat onze aangepaste functies alle fouten verwerken, heeft set_error_handler() alleen één parameter nodig, maar je kunt een tweede parameter toevoegen om het foutniveau te specificeren.

Voorbeeld

Test deze foutafhandeling door een niet bestaande variabele uit te voeren om te proberen uit te voeren:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Fout:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

De uitvoer van bovenstaande code zou moeten lijken op:

Fout: [8] Ondefinieerde variabele: test

Fout triggeren

Op de locatie van gebruikersinput in het script, wanneer de gebruikersinput ongeldig is, is het nuttig om fouten te triggeren. In PHP wordt deze taak uitgevoerd door trigger_error().

Voorbeeld

In dit voorbeeld, als de "test" variabele groter is dan "1", zal er een fout optreden:

<?php
$test=2;
if ($test>1)
{
trigger_error("Waarde moet 1 of lager zijn");
}
?>

De uitvoer van bovenstaande code zou moeten lijken op:

Waarschuwing: Waarde moet 1 of lager zijn
in C:\webfolder\test.php op regel 6

U kunt fouten triggeren op elke locatie in het script, door middel van de toegevoegde tweede parameter kunt u de geactiveerde foutniveau bepalen.

Mogelijke fouttypen:

  • E_USER_ERROR - Fatale gebruikersgegenereerde run-time fouten. De fout kan niet worden hersteld. De uitvoering van het script wordt onderbroken.
  • E_USER_WARNING - Niet-fatale gebruikersgegenereerde run-time waarschuwingen. De uitvoering van het script wordt niet onderbroken.
  • E_USER_NOTICE - Standaard. Door de gebruiker gegenereerde run-time meldingen. Het script heeft mogelijke fouten gevonden, maar kan ook optreden wanneer het script normaal draait.

Voorbeeld

In dit voorbeeld, als de "test" variabele groter is dan "1", zal er een E_USER_WARNING-fout optreden. Als er een E_USER_WARNING optreedt, zullen we onze aangepaste foutafhandeling gebruiken en het script afsluiten:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Fout:</b> [$errno] $errstr<br />";
 echo "Einde Script";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Waarde moet 1 of lager zijn",E_USER_WARNING);
 }
?>

De uitvoer van bovenstaande code zou moeten lijken op:

Fout: [512] Waarde moet 1 of lager zijn
Einde Script

Nu dat we hebben geleerd hoe we onze eigen error kunnen aanmaken en hoe we deze kunnen triggeren, laten we nu het foutlogboek onderzoeken.

Foutlogboek

Standaard, op basis van de configuratie van error_log in php.ini, stuurt PHP foutlogboeken naar het foutlogboeksytem of bestand van de server. Door de functie error_log() te gebruiken, kunt u foutlogboeken naar een specifiek bestand of een externe bestemming verzenden.

Het naar uzelf sturen van foutmeldingen via e-mail is een goed manier om een specifieke fout te notificeren.

Foutmeldingen via E-Mail verzenden

In het volgende voorbeeld zullen we een e-mail met foutmeldingen verzenden en het script afbreken als een specifieke fout optreedt:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Fout:</b> [$errno] $errstr<br />";
 echo "Webmaster heeft kennisgenomen";
 error_log("Fout: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Waarde moet 1 of lager zijn",E_USER_WARNING);
 }
?>

De uitvoer van bovenstaande code zou moeten lijken op:

Fout: [512] Waarde moet 1 of lager zijn
De webmaster is geïnformeerd

De e-mails die worden ontvangen van bovenstaande code zijn soortgelijk:

Fout: [512] Waarde moet 1 of lager zijn

Deze methode is niet geschikt voor alle fouten. Algemene fouten moeten worden vastgelegd via het gebruik van het standaard PHP logsjysteem op de server.