PHP/MySQL - Fehlersuche - Error Reporting
1. Die Abschnitte
- Überblick
- Fehlertypen
- Error Reporting
- MySQL-Fehler
- Syntaxfehler
- Idiotische Fehler
- Testausgaben
- Falsche Fehler
- Fehler unterdrücken
2. Grundsätzliches
In PHP hat man doch tatsächlich Einfluss auf Fehlermeldungen! Das heißt aber nicht, dass die eigentlichen Fehler automatisch
verschwinden, wenn man an den möglichen Einstellungen herumschraubt. Nein, sie werden nur nicht angezeigt. Das Ganze nennt
sich error_reporting
und kann auf zweierlei Weise eingestellt werden.
- in der Konfigurationsdatei
php.ini
- direkt im Code
Solltet ihr euren Auftritt bei einem Provider haben, der das Folgende innerhalb des Codes(!) nicht zulässt, dann sucht euch einen neuen.
3. Error-Level
Davon gibt es eigentlich 13. Ich werde der Einfachheit halber aber nur die wichtigen vorstellen.
E_STRICT
(da mosert PHP eigentlich an Allem rum, weil da eine bestimmte Art von Programmierung erwartet wird)E_ERROR
(gibt nur "Fatal Errors" aus)E_PARSE
(gibt nur "Parse Errors" aus)E_WARNING
(gibt nur "Warnings" aus)E_NOTICE
(gibt nur "Notices" aus)E_ALL
(gibt "Fatal Errors", "Parse Errors", "Warnings" und "Notices" aus)
Nun hat man die Möglichkeit, verschiedene Bedingungen zu definieren, also zum Beispiel E_ALL - E_ERROR
oder
E_ALL & ~ E_NOTICE
. Das heißt soviel wie
Zeige mir alles, wasE_ALL
auswirft aber nicht die Fatal Errors bzw. alleE_ALL
aber keine Notices. [Quelle: euer PHP-Parser]
Eigentlich sind diese Einstellungen mit Zahlencodes verbunden, die man nutzen sollte. Da das aber ziemlich unübersichtlich ist, verzichte ich auf weitere Erläuterungen.
4. Und nun?
Für eine sinnvolle Fehlersuche inklusive einer Anleitung zum sauberen Programmieren sollte man sich auf jeden Fall für
E_ALL
entscheiden. Alles andere ist ziemlich suboptimal!
Saubere Programmierung?
Ja, ich gestehe! Auch ich produziere von Zeit zu Zeit äußerst schlampigen Code. Das passiert immer dann, wenn es mal wieder
gaaaaanz gaaaanz schnell gehen muss. Allerdings bin ich mir darüber im Klaren, was für einen Müll ich da gerade zusammenhaue.
Auf Grund langjähriger Erfahrungen weiß ich einfach, dass es funktioniert. Wenn euch also Fehlermeldungen wie zum Beispiel
undefined index in ...
oder undefined variable in ...
nerven, dann könnt ihr die notfalls abklemmen.
Dabei handelt es sich um die schon erwähnten "Notices", also nur Hinweise auf schlampigen Code. Dazu benötigt man in seiner Einstellung
nur diese Anweisung: E_ALL - E_NOTICE
, also alle Fehler zeigen ohne Hinweise. Da gibt es allerdings unterschiedliche
Schreibweisen. Laut php.ini
sollte man das so notieren: E_ALL & ~ E_NOTICE
.
Aber bitte! Wirklich nur im Notfall. Oder wenn man euch fremden und schlampigen Code aufzwingt, und ihr keine Lust habt, die Unsauberkeiten anderer Leute zu beseitigen. Oder wenn euch sauberes Programmieren eh schnurz ist. Oder wenn es euch sowieso nicht juckt, was andere denken. Oder ... to be continued.
5. Und wie...
... bitte binde ich das jetzt ein? Also wenn ihr euer lokales Testsystem konfigurieren wollt, dann sucht in der
php.ini
nach dem Abschnitt Error handling and logging
. Dort sollten folgende Einträge vorhanden sein. Wenn
nicht, bitte anpassen oder einfügen. Und nicht vergessen, den Apache noch einmal um den Wigwam zu jagen, vulgo neu starten.
error_reporting = E_ALL
(ggf.E_ALL - E_NOTICE
oderE_ALL & ~ E_NOTICE
, siehe oben)display_errors = On
display_startup_errors = On
log_errors = On
(Optional, dazu später mehr)
Ansonsten reicht zum Beispiel eine zentrale Konfigurationsdatei mit dem folgenden Eintrag aus.
<?php
// So
error_reporting (E_ALL);
// Oder so
error_reporting(E_ALL & ~ E_NOTICE);
?>
Diese Datei bindet ihr dann über include
oder require
in eure PHP-Dateien ein. Und zwar ganz oben! Unter Umständen
müsst ihr noch den folgenden Eintrag ergänzen, da sonst keine Fehler angezeigt werden.
ini_set ('display_errors', 'On');
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt