Mika: Fehler abfangen mit PHP

Hi,
ich möchte in meinem PHP Script gerne alle Fehler abfangen und in eine Datenbank schreiben.

Jetzt hab ich etwas gegoogelt und bin auf folgende Lösung gekommen:

set_error_handler("logging");

function logging($errno, $errmsg, $filename, $linenum) {
 $message="$errno - $errmsg - $filename - $linenum<br>";

$datetime=date("Y-m-d H:i:s");

$sql = "INSERT INTO logging
 (user, datetime, text)
 VALUES ('$_SESSION[id]', '$datetime', '$message')";

sql_execute($sql);
}

Das funktioniert soweit auch wunderbar. Das Problem ist nun, dass er wirklich jeden s***** mit logged.

Auszug:
8 - Use of undefined constant file_url_prefix - assumed 'file_url_prefix' -/home/XXX/www/load.php - 19

Wie kann ich diese Fehler selektieren?

Gruß und Danke schonmal,
Mika

  1. Hallo Mika,

    $datetime=date("Y-m-d H:i:s");

    [ ] du kennst die MySQL-Funktion NOW()

    Das funktioniert soweit auch wunderbar. Das Problem ist nun, dass er wirklich jeden s***** mit logged.

    Naja, wenn du ihm nichts anderes sagst :-) Anhand des ersten Parameters von logging() kannst du unterscheiden, welcher Fehler vorliegt (welcher Wert was bedeutet steht in http://de3.php.net/ref.errorfunc#errorfunc.constants) und ggf. die Meldung nicht speichern.

    8 - Use of undefined constant file_url_prefix - assumed 'file_url_prefix' -/home/XXX/www/load.php - 19
    Wie kann ich diese Fehler selektieren?

    Das ist kein Fehler, dass ist eine Notice - und die solltest du nicht ignorieren, sondern beseitigen (warum der Fehler auftritt, ist auf http://php-faq.de/q/q-fehler-konstante.html erklärt).

    Grüße aus Nürnberg
    Tobias

    1. Hi,

      Fatal Errors, wenn z.B. ne Funktion nicht existiert werden aber trotzdem angezeigt und nicht an die Funktion übergeben, wieso?

      1. Hi,

        Fatal Errors, wenn z.B. ne Funktion nicht existiert werden aber trotzdem angezeigt und nicht an die Funktion übergeben, wieso?

        Weil bei einem Fatal Error die Verarbeitung des PHP-Scriptes abbricht. Dein neuer Error Handler gehört aber zum PHP-Script.

        --
        MfG Martin Rozmus
  2. Hallo,

    ich möchte mich da gelich mal dranhängen.

    ich verwende da eine Konstruktion, die Tom sich mal irgendwann ausgedacht hat. Hier als Beispiel:

    <?php   ### error_number.php ###

    $GLOBALS['ERROR'] = array();
    ini_set('track_errors','1');

    set_error_handler("get_errors");

    function get_errors($errno, $errmsg, $filename, $linenum ) #, $_vartable, $php_errormsg)
    {
    #  global $php_errormsg;

    $GLOBALS['ERROR']['errno'] = $errno;
      $GLOBALS['ERROR']['errmsg'] = $errmsg;
      $GLOBALS['ERROR']['filename'] = $filename;
      $GLOBALS['ERROR']['linenum'] = $linenum;

    $GLOBALS['ERROR']['php_errormsg'] = $php_errormsg;

    }

    #------------------------------------------------------------------------------

    Feher provozieren:

    $fh = fopen('nonexisting','rb+');

    echo "<pre>\n";

    if (!empty($php_errormsg))
    {
      echo "Fehlermeldung: $php_errormsg<br>\n";
    }

    print_r($GLOBALS['ERROR']);

    echo "</pre>\n";

    ?>

    Das Ding hat für mich immer noch zwei Schönheitsfehler.
    Ich weiß nicht, wie man innerhalb eines Scriptes das Fehlerarray automatisch zurücksetzen könnte, außer man erzeugt nochmals eine Abfragefunktion dafür, oder macht es explizit, also nach der Masche

    if(!empty($GLOBALS['ERROR']['errno']))
      {
        # Fehlerbehandlung
        $GLOBALS['ERROR'] = array;
      }

    Und dann kriege ich es einfach nicht hin, das $php_errormsg in das Fehlerarray zu übertragen. Das ist zwar nicht wirklich wichtig, da die Fehlermeldung auch in $errmsg drinsteht, aber wieso es nicht klappt, interessiert mich trotzdem.

    Das 6. Argument ist noch nicht vorhanden, wenn der Errorhandler ausgeführt wird.

    Lieber wäre mir, wenn man die Fehlernummer $errno ohne dieses wilde Konstrukt abfragen könnte. Hat da jemand eine Idee, wie man da herankommt?

    LG
    Chris