Error-Handler - Fatal Errors loggen?

Danke ;)

Ich habe es ein wenig umständlicher gemacht... Wenn ich auf der Seite eingeloggt bin (und Administratorrechte habe) bekomme ich in jedem Fall den Fehler in einem kleinen Div (absolut oben links) mit allen Details angezeigt. Habe ich für die beste Lösung gehalten. So bekomme ich auch bisher unerkannte Fehler auf dem Live-System mit (wenn ich eingeloggt bin).

lg
 
So ich habe meine Funktion nun ausgebaut.

Generell wird in jeder Datei erstmal in der ersten Zeile das error_reporting auf 0 gesetzt (damit bei includes etc. keine Fehler auftauchen).

Falls nun diese Datei eingebunden wird wird versucht via ini_set das Anzeigen der Fehler zu unterdrücken. Falls das klappt wird ein define gemacht (damit ich später noch weiß das das ganze geklappt hat) und es wird das error_reporting aktiviert (kann ja nun gefahrlos geschehen, da die Fehler ja nicht angezeigt werden).

Falls nun ein Fehler auftritt wird meine eigene Fehlerroutine ausgeführt. Entweder das error_reporting passt zum aktuellen Fehlertyp oder der ini_set hat nicht geklappt und der define existiert nicht (dann wird jeder Fehler behandelt).
Ansonsten eben nur die, die nicht mit einem @ gekennzeichnet sind.

Funktioniert prima.
Nochmal vielen Dank an EvilO.

Falls jemand noch bessere Ideen hat - her damit :D

PHP:
<?php

// Fehlerreporting einschalten aber Fehler unterdrücken.
if (ini_set('display_errors', false)) {
	define("INI_DISPLAY_ERRORS_OFF", 'YES');
	error_reporting(E_ALL);
}

// Fehlerbehandlungsfunktion
function newErrorHandler($fehlercode, $fehlertext, $fehlerdatei, $fehlerzeile) {
	
	if((defined("INI_DISPLAY_ERRORS_OFF") && ($fehlercode & error_reporting())) || !defined("INI_DISPLAY_ERRORS_OFF")) {
		// Hier werden nur Fehler behandelt die nicht mit einem @ gekennzeichnet wurden
		// (oder display_error konnte nicht auf false gesetzt werden
		
		$types = array(
			1 => 'E_ERROR',
			2 => 'E_WARNING',
			4 => 'E_PARSE',
			8 => 'E_NOTICE',
			16 => 'E_CORE_ERROR',
			32 => 'E_CORE_WARNING',
			64 => 'E_COMPILE_ERROR',
			128 => 'E_COMPILE_WARNING',
			256 => 'E_USER_ERROR',
			512 => 'E_USER_WARNING',
			1024 => 'E_USER_NOTICE',
			6143 => 'E_ALL',
			2048 => 'E_STRICT',
			4096 => 'E_RECOVERABLE_ERROR'
		);
		
		if (isset($types[$fehlercode])) {
			$errorType = $types[$fehlercode];
		}
		else {
			$errorType = 'unknown';
		}
		
		$writing_possible = true;
		
		if (!error_log(trim($errorType.' ['.$fehlercode.']: '.$fehlertext.' in Line '.$fehlerzeile.' ('.$fehlerdatei.')'), 0)) {
			$writing_possible = false;
		}
		
		// Daten außerdem in mySQL sichern
		$sqltraced = false;
		if (class_exists('SqlConnection') && in_array('sqlconn', array_keys($GLOBALS))) {
			$sqlconn_l = $GLOBALS['sqlconn'];
			
			if ($sqlconn_l instanceof SqlConnection) {
				
				$sql_user_ip = $_SERVER['REMOTE_ADDR'];
				$sql_msg = $sqlconn_l->escape_string($fehlertext);
				$sql_file = $sqlconn_l->escape_string($fehlerdatei);
				$sql_logged = ($writing_possible) ? 'Yes' : 'No';
				$errorType = $sqlconn_l->escape_string($errorType);
				
				if ($sqlconn_l->query("INSERT INTO errlog_php(ip, no, msg, file, line, type, logged) VALUES ('$sql_user_ip', $fehlercode, '$sql_msg', '$sql_file', $fehlerzeile, '$errorType', '$sql_logged');")) {
					$sqltraced = true;
				}
			}
		}
		
		$adminshow = false;
		if (class_exists('PageUser') && in_array('user', array_keys($GLOBALS))) {
			$pageuser = $GLOBALS['user'];
			if (($pageuser instanceof PageUser) && ($pageuser->get_user_level() == PAGEUSER_LEVEL_ADMINISTRATOR)) {
				$adminshow = true;
			}
		}
		
		if ($adminshow) {
			echo '
			<div class="php_error">'.$errorType.' ['.$fehlercode.']: <br />
			<b>'.$fehlertext.'</b><br />
			<br />
			Line: '.$fehlerzeile.'<br />
			File: '.$fehlerdatei.'<br />
			
			<br />
			';
			if ($sqltraced) {
				echo '<i>Fehler in Datenbank gesichert</i><br />';
			}
			else {
				echo '<b>Konnte Fehler nicht sichern</b><br />';
			}
			
			if ($writing_possible) {
				echo '<i>Fehler in Serverlog gesichert</i>';
			}
			else {
				echo '<b>Konnte Serverlog nicht schreiben</b>';
			}
			
			echo '</div>';
		}
		
	}
	
    //Damit die PHP-interne Fehlerbehandlung nicht ausgeführt wird
    return true;
}

set_error_handler('newErrorHandler');

?>

lg
 
Hey danke!
So hat sich bei mir auch direkt nen Fehler eingeschlichen...

Code:
6143 => 'E_ALL'

war falsch ;)
Keine Ahnung woher ich den Wert hatte...
Aber nun können sich die Teile ja soviel ändern wie sie wollen. Gute Idee!

lg
 
Zurück