From c053df0612d5bf69872b7bf815597fb2ccc1d592 Mon Sep 17 00:00:00 2001 From: following Date: Mon, 25 Mar 2013 16:26:20 +0100 Subject: [PATCH] improved error handling and reporting --- htdocs/html/{dberror.php => error.php} | 17 ++--- htdocs/lib/clicompatbase.inc.php | 12 ++-- htdocs/lib/settings-dev.inc.php | 2 +- htdocs/lib2/common.inc.php | 4 ++ htdocs/lib2/db.inc.php | 9 ++- htdocs/lib2/errorhandler.inc.php | 93 ++++++++++++++++++++++++++ 6 files changed, 121 insertions(+), 16 deletions(-) rename htdocs/html/{dberror.php => error.php} (70%) create mode 100644 htdocs/lib2/errorhandler.inc.php diff --git a/htdocs/html/dberror.php b/htdocs/html/error.php similarity index 70% rename from htdocs/html/dberror.php rename to htdocs/html/error.php index 390cbf6b..fbd0ca4d 100644 --- a/htdocs/html/dberror.php +++ b/htdocs/html/error.php @@ -2,7 +2,7 @@ - Opencaching.de - Datenbankproblem + Opencaching.de - Interner Fehler @@ -13,7 +13,7 @@
- oc-Logo + oc-Logo   @@ -24,19 +24,20 @@
-

Fehler beim Datenbankzugriff

Entschuldigung, bei der Darstellung der Seite ist ein interner Fehler aufgetreten. + echo "

" . $errtitle . "

"; + echo '

Entschuldigung, bei der Darstellung der Seite ist ein intener Fehler aufgetreten. Falls dieses Problem für längere Zeit bestehen sollte, informiere uns bitte per - Email.

-

' . $dberrmsg . '

+ Email.

+

' . $errmsg . '

Zurück zur Startseite



An error occured while displaying the requested page. If this problem persists for a longer time, please inform us via - email.

'; + email.

'; ?>
diff --git a/htdocs/lib/clicompatbase.inc.php b/htdocs/lib/clicompatbase.inc.php index 776cc6e1..1c85b968 100644 --- a/htdocs/lib/clicompatbase.inc.php +++ b/htdocs/lib/clicompatbase.inc.php @@ -50,9 +50,12 @@ require_once($opt['rootpath'] . 'lib/settings.inc.php'); require_once($opt['rootpath'] . 'lib/calculation.inc.php'); require_once($opt['rootpath'] . 'lib/consts.inc.php'); + require_once($opt['rootpath'] . 'lib2/errorhandler.inc.php'); - // timezone + // basic PHP settings date_default_timezone_set($timezone); + if ($debug_page) + register_errorhandlers(); // not for production use yet, must be tested $dblink_slave = false; $db_error = 0; @@ -460,10 +463,10 @@ if ($interface_output == 'html') { // display errorpage - $dberrmsg = $dberrormsg . ($debug_page ? "
" . $msql_error : ""); + $errmsg = $dberrormsg . ($debug_page ? "
" . $msql_error : ""); if ($db_error <= 1) { - tpl_errorMsg('sql_error', $dberrmsg); + tpl_errorMsg('sql_error', $errmsg); } else { @@ -471,7 +474,8 @@ // build the error template (e.g. because connection was lost, or an error mail // could not load translations from database) - require("html/dberror.php"); + $errtitle = "Datenbankfehler"; + require("html/error.php"); } exit; } diff --git a/htdocs/lib/settings-dev.inc.php b/htdocs/lib/settings-dev.inc.php index 56b09afc..bf931595 100644 --- a/htdocs/lib/settings-dev.inc.php +++ b/htdocs/lib/settings-dev.inc.php @@ -31,7 +31,7 @@ if (!isset($style)) $style = 'ocstyle'; //pagetitle - if (!isset($pagetitle)) $pagetitle = 'www.opencaching.de'; + $pagetitle = 'local.opencaching.de'; $opt['page']['title'] = 'OPENCACHING'; $opt['page']['subtitle1'] = 'Geocaching with Opencaching'; $opt['page']['subtitle2'] = ''; diff --git a/htdocs/lib2/common.inc.php b/htdocs/lib2/common.inc.php index 762cf964..d180002f 100644 --- a/htdocs/lib2/common.inc.php +++ b/htdocs/lib2/common.inc.php @@ -54,6 +54,7 @@ function __autoload($class_name) $opt['debug'] = $opt['debug'] & ~DEBUG_TRANSLATE; } + require_once($opt['rootpath'] . 'lib2/errorhandler.inc.php'); configure_php(); require($opt['rootpath'] . 'lib2/cookie.class.php'); @@ -139,6 +140,9 @@ function configure_php() ini_set('display_errors', true); ini_set('error_reporting', E_ALL); ini_set('mysql.trace_mode', true); + + // not for production use yet (has to be tested thoroughly) + register_errorhandlers(); } else { diff --git a/htdocs/lib2/db.inc.php b/htdocs/lib2/db.inc.php index 1fcc8214..585a94cc 100644 --- a/htdocs/lib2/db.inc.php +++ b/htdocs/lib2/db.inc.php @@ -895,11 +895,14 @@ // build the error template (e.g. because connection was lost, or an error mail // could not load translations from database) - $dberrmsg = 'MySQL error (' . $errno . '): ' . $error; - require("html/dberror.php"); + if ($opt['db']['error']['display'] == true) + $errmsg = 'MySQL error recursion (' . $errno . '): ' . $error; + else + $errmsg = ""; + $errtitle = "Datenbankfehler"; + require("html/error.php"); exit; } - $db['error'] = true; if ($db['connected'] == false) diff --git a/htdocs/lib2/errorhandler.inc.php b/htdocs/lib2/errorhandler.inc.php new file mode 100644 index 00000000..5eb36e4e --- /dev/null +++ b/htdocs/lib2/errorhandler.inc.php @@ -0,0 +1,93 @@ += 5.2.0 */ ($error = error_get_last()) && + in_array($error['type'], array(E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR))) + { + $error_handled = true; + + $error = "(" . $error['type'] . ") " . $error['message'] . + " at line " . $error['line'] . " of " . $error['file']; + send_errormail($error); + + $errtitle = "PHP-Fehler"; + if (display_error()) + $errmsg = $error; + else + $errmsg = ""; + + require(dirname(__FILE__) . "/../html/error.php"); + } +} + +function display_error() +{ + global $opt, $debug_page; + return (isset($opt['db']['error']['display']) && $opt['db']['error']['display']) || + (isset($debug_page) && $debug_page); +} + +function send_errormail($errmsg) +{ + global $opt, $sql_errormail, $absolute_server_URI; + + if (isset($opt['db']['error']['mail']) && $opt['db']['error']['mail'] != '') + { + @mb_send_mail($opt['db']['error']['mail'], $opt['mail']['subject'] . " PHP error", $errmsg); + } + else if (isset($sql_errormail) && $sql_errormail != '') + { + $url = parse_url($absolute_server_URI); + @mb_send_mail($sql_errormail, "[" . $url['host'] . "] PHP error", $errmsg); + } +} + +?> \ No newline at end of file