Eine eigene Fehlerbehandlung

GiFt-ZwErG

Erfahrenes Mitglied
Gibt es eine Möglichkeit, über ein PHP-Script die Fehler-Echos vollständig abzuschalten und alle Errors und Warnings in einen String reinzuladen?
Man kann die Errors ja mit @ unterdrücken aber werden die dann einfach verworfen?
Ich möchte eine eigene Fehlermeldung ausgeben und diese dann mit der vollständigen ( PHP Fehlermeldung ) in eine Datei schreiben.
Ich möchte am liebsten alle Fehler auf meiner Webseite protokollieren.
Geht das?
Ich habe mir schon das error_reporting und ein das error_handling ( englisch ) angeschaut.

MFG
Sandro
 
PHP besutzt bereits eine Fehler-Log-Funktion, die nur noch eingerichtet werden muss (log_errors“- und error_log“-Konfigurationsdirektiven). Du müsstest dann nur noch dafür sorgen, dass die von PHP generierten Fehlermeldungen nicht ausgegeben werden (display_errors“-Konfigurationsdirektive), was übrigens auch der Sicherheit dient („Security through obscurity“-Prinzip). Mit der set_error_handler()-Funktion kannst du schließlich prüfen, welche Art von Fehler auftrat und gegebenenfalls einen 500er Statuscode abschicken oder ähnliches.
 
Danke für die Antworten.
Ich möchte die Fehler aber formatiert in eine Datei ( oder in eine DB ) eintragen.

ZEIT | Verbindungsfehler zur Datenbank | PHP-FEHLER KOMPLETT
ZEIT | Fehler beim schreiben der Datei | PHP-FEHLER KOMPLETT

SO soll die Datei bzw die DB aussehen.
Ich möchte ungern die PHP Datei editieren, da es ein CMS werden soll was ich dann auch zur Verfügung stellen möchte. Da nicht jeder Zugriff auf die PHP.ini hat, wäre eine Klasse oder Funktion zur Fehlerbehandlung ideal.

Ich möchte die Fehler aus Datensicherheitsgründen unterdrücken aber trotzde möchte ich in meinem Admin-Control-Center sehen was für Fehler auf welcher Seite, wann aufgetreten sind.

Danke
 
woher soll dein Script wissen, wenn du nichts an der php.ini änderst und an irgendeiner Datei, dass er was mit den Fehler machen soll? :eek:
Du wirst nicht daran vorbei kommen, ein paar Zeilen-Code irgendwo dazuzuschreiben, sind ja wirklich nur 5-10 mit denen du die Methode set_error_handler() implementierst
 
Is mir schon klar dass ich was ändern muss. Ich habe auch lediglich geschrieben, dass ich alles ausserhalb der PHP.ini machen möchte...
error_reporting(E_ALL); zb. dass habe ich in allen Scripts schon drin ( bzw. in der config ).
Jetzt fehlt mir nur noch ein bisschen Code um die Fehler in die Datei zu schreiben ( formatiert mit Zusatzinfos usw ) und etwas, um den Fehler zu unterdrücken bzw eine eigene Meldung anzuzeigen .. ( zb. or die('FEHLER'); )

MFG
 
Anmerkung: Die folgenden Fehlertypen können nicht von einer benutzerdefinierten Funktion behandelt werden: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR und E_COMPILE_WARNING.

Bringt mir dann wohl nix...
Ich möchte ja ALLE Fehler loggen.
MFG
 
Ok.. ich habs mir ma angeschaut und es funktioniert alles perfekt.

PHP:
<?php
// eigenen Handler definieren
set_error_handler('myHandler');
// Code für den eigenen Handler
function myHandler($code, $msg, $file, $line, $context) {
    // Fehlerseite ausgeben
    echo "<html><head></head><body>";
    echo "<h2 align=center>Fehler!</h2>";
    echo "<font color=red size=+1>";
    echo "Bei der Bearbeitung Ihrer Anfrage ist ein Fehler aufgetreten. Bitte besuchen Sie unsere <a href=http://www.domain.dom>Homepage</a> und versuchen Sie es noch einmal.";
    echo "</font>";
    echo "</body></html>";
    
    // Fehler per E-Mail an den Administrator melden
    //$body = "Fehler $msg in Datei $file (Zeile $line), Uhrzeit:" . date ("d-M-Y h:i:s");
    //$body .= "\n\n" . print_r($context, TRUE);
    //mail ("webmaster@domain.dom", "Website-Fehler", $body);

    // Fehler in einer Datei protokollieren
    $handle = fopen("web.log", "a");
    $logData = date("d-M-Y h:i:s").", $code, $msg, $line, $file\n"; 
    fwrite($handle, $logData);
    fclose($handle);
    // Ausführung des Scripts abbrechen
    die();
}

// eine Benachrichtigung erzeugen

//funktioniert
echo $testvar;

//funktioniert
$t = I_AM_NOT_DEFINED;

//funktioniert nicht
$t1 = distance($c, $b) . "\n";

?>

Bei der Variable wird die eigene Fehlerseite angezeigt und der Fehler in die Log geschrieben.
Wenn jetz allerdings die eine nicht vorhandene Funktion ( distance() ) aufgerufen wird, wird die richtige Fehlermeldung angezeigt.
Wenn ich error_reporting() auf E_WARNING setze, wird der Fehler nicht mehr angezeigt ( da es ja E_ERROR wäre ) aber auch nicht geloggt.
Ich möchte aber gern alle ( E_ALL ) Fehler loggen. Aber keinen davon anzeigen.

Welche Veränderungen muss ich an dem Script dann noch vornehmen um das zu erreichen.

Danke
MFG


EDIT::
Habe noch etwas dazu gefunden:

Hinweis: Es ist wichtig, daran zu denken, dass Parsefehler und schwerwiegende Fehler (fatal errors) aufgrund ihrer Natur den eigenen Error-Handler umgehen und mit dem standardmäßigen PHP-Error-Handling-Mechanismus angezeigt werden. Die Anzeige dieser Fehler kann mithilfe der Standardfunktion error_reporting() kontrolliert werden, wie oben beschrieben.

Dh. dass man die Anzeige von schwerwiegenden Fehler lediglich mit error_reporting() deaktivieren kann. Aber loggen kann man diese nicht?
 
Zuletzt bearbeitet:
Zurück