PHP/MySQL - Fehlersuche - Fehler unterdrücken
1. Die Abschnitte
- Überblick
- Fehlertypen
- Error Reporting
- MySQL-Fehler
- Syntaxfehler
- Idiotische Fehler
- Testausgaben
- Falsche Fehler
- Fehler unterdrücken
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 ($val, 2));
}
}
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.