Hauptmenü

Untermenü

PHP/MySQL - Fehlersuche - Fehler unterdrücken

1. Die Abschnitte

2. Wieso unterdrücken?

Nun, während der Entwicklungsphase sollte man schon mal gar nichts unterdrücken. Daher gelten alle folgenden Tipps für Live-Systeme, also wenn euer Machwerk online ist. Das hat zwei Gründe. Zum einen machen sich Fehlermeldungen nicht so gut und zum anderen können mögliche Hacker Informationen über euer System herausfinden und die zu Angriffen nutzen.

3. Der Klammeraffe

Wenn man am Beginn einer Anweisung das @-Zeichen setzt, so werden mögliche Fehler auch ohne Anpassung beim Error Reporting nicht angezeigt.


<?php
  @$db   mysql_connect ($host$user$password);
  @$open fopen ('bla.txt');
?>

Mein Tipp. Lasst die Finger davon! Das ist keine vernünftige Vorgehensweise.

4. Eine erste Möglichkeit

Man unterscheidet beim Error Reporting zwischen dem Entwicklungs- und dem Live-Server. Bei Letzterem werden die Fehler nicht ausgegeben sondern in eine Logdatei geschrieben.


<?php
  error_reporting (E_ALL);  
  if ('localhost' == $_SERVER['SERVER_NAME'])
  {
    define ('DEBUG'true);
  }
  else
  {
    define ('DEBUG'false);
  }
  if (true === DEBUG)
  {    
    ini_set('display_errors''On');
  }
  else
  {
    ini_set('display_errors''Off');
    ini_set('log_errors''On');
    ini_set('error_log''fehler.txt');
  }
?>

Aber!

Damit kann man keine SQL-Fehler abfangen. Außerdem muss man ständig in die Logdatei sehen, um Fehler aufzuspüren. Gut, das mit den SQL-Fehlern kann man ziemlich einfach umgehen, indem man obige Einstellungen nutzt.


<?php
  $db  mysql_select_db ($database);
  if (true === DEBUG)
  {
    debugMySQLError();
  }
  function debugMySQLError()
  {
    if (mysql_error())
    {
      echo mysql_error();
    }
  }
?>

5. Eine bessere Möglichkeit

Seit PHP5 kann man mit den so genannten Exceptions arbeiten und entsprechend darauf reagieren. Wer sich nicht mit OOP auskennt, kann auch das getrost prozedural machen.


<?php
  function getSquareRoot($val)
  {
    if (!is_numeric($val)) 
    {
      throw new Exception('Eine Zahl du Nase!');
    }
    else 
    {
      return (bcsqrt ($val2));
    }
  }
  
  try 
  {
    echo getSquareRoot(5);
    echo getSquareRoot('bla');
  }
  catch (Exception $e) 
  {
    if (true === DEBUG)
    {    
      // Entwicklungsserver
    }
    else 
    {
      // Liveserver
    }
  }
?>

6. Fazit

Ich hoffe, ihr habt die Grundprinzipien des Debuggings verstanden. Also haltet euch gefälligst an die Tipps. Und nervt nicht ständig irgendwelche Leute in Foren, weil euch mal wieder ein pisseliger Fehler nicht auffällt.

zurück zum vorherigen Abschnitt