Vermeidung von PHP-Fehlermeldungen

Ein PHP-Programm kann längst nicht alles bewerkstelligen, werden vom Programmierer Bearbeitungsschritte ausgeführt, die das Programm nicht versteht, wird im Regelfall eine Fehlermeldung ausgegeben. Diese ist dazu da, dem Programmierer darauf hinzuweisen, dass sein Vorhaben so nicht möglich ist. Durch die Ausgabe der Fehlermeldung wird auch der Fehler (der falsche Bearbeitungsschritt) abgefangen.

[Bildschirmfoto] Vermeidung von PHP-Fehlermeldungen

Jeder der schon einmal mit PHP zu tun hatte kennt diese Fehlermeldungen vom PHP-Interpreter. Diese Fehlermeldungen haben den Vorteil dass sich der Programmierer genauer mit dem PHP-Code auseinandersetzen muss und dabei die Programmiersprache erlernt

Die Fehlermeldung zeigt die Zeile an wo der Fehler auftrat, nicht unbedingt in welcher Zeile dieser gemacht wurde! Sowie den Namen der Datei die den Fehler produziert hat und einen Hinweis zur möglichen Ursache.

➤ Einfache Kenntnisse in der englischen Sprache reichen zumeist aus um die Fehlermeldungen zu verstehen (ein Wörterbuch hilft). Sie können aber auch nach der Fehlermeldung googeln oder bingen , in zahlreichen Foren haben andere ähnliche Probleme und vielleicht auch Lösungsvorschläge. Bevor Sie jedoch jemanden aus einem Forum mit Ihrem Problem belästigen, suchen Sie selbst nach dem Fehler.

RTFM
Read The Fine Manual
php.net

Auf dieser Seite finden Sie:

Gründe für das entstehen von Fehlermeldungen

Vermeidung von Fehlern

Ich empfehle jeden Programmierer die Verwendung eines Programmeditors, der über eine Texthervorhebung für HTML, CSS, PHP und JavaScript verfügt.
Gute Editoren zeigen alle PHP-nativen* Funktionen in einer anderen Farbe an. Durch die Farbhervorhebung findet man auf diese Art sehr einfach vergessene Abschluss-Tags, ausgeklammerten Code und auch über die Anzeige von Zeilennummern die Position, an der ein Fehler aufgetreten ist.

Notepad++
* Bildschirmfoto: Notepad++ (kostenlos) - notepad-plus.sourceforge.net
Durch farbiges Anzeigen der Sprachelemente vereinfacht Notepad++ das Schreiben von Programmen.

Zeichenmaskierung - Einfache oder doppelte Anführungszeichen

Verwenden Sie für die Ausgabe mit echo nur einfache Anführungszeichen (Zeile 5), ansonsten müssen Anführungszeichen innerhalb von Anführungszeichen maskiert werden.

Besonders beim Kontextwechsel (HTML-Attribute, mit PHP erzeugter JavaScript- oder CSS-Code) ist es wichtig die Anführungszeichen richtig zu maskieren.

1
2
3
4
5
6
7
8
9
10
<?php
$vorname 
'Reiner';
$nachname "Zufall";

echo 
'<input type="text" name="Name" value="' $vorname ' ' $nachname '" style="width: 200px;">';

echo 
"<input type=\"text\" name=\"Name\" value=\"$vorname $nachname\" style=\"width: 200px;\">";

echo 
'<input type="button" value="Meldung" onclick="alert(\'Hallo Welt!\');">';
?>

Fehlermeldungen ausschalten oder unterdrücken

Fehlermeldungen ausschalten:

<?php error_reporting(0); ?>

Fehlermeldungen unterdrücken:

<?php echo @$variable; ?>

Das @-Zeichen (Fehler-Kontroll-Operator) dient zur Fehler-Unterdrückung. Zum Beispiel wenn eine Variable nicht deklariert wurde. Auch wenn dadurch der Fehler nicht mehr angezeigt wird, tritt dieser weiterhin auf. Falls weitere Probleme in diesem Ausdruck auftreten sollten, werden diese auch unterdrückt. So kann es zu schwerwiegenden Problemen kommen, ohne dass man einen Hinweis bekommt, wo diese liegen.

➤ Man sollte immer erst eine Alternative suchen bevor man das @-Zeichen verwendet, dieses Zeichen gilt allgemein als schlechter Programmierstil.

Grundsätzlich ist hierzu folgendes zu empfehlen:

Online sollten Fehlermeldungen nicht ausgegeben werden, da es die Besucher eher verwirrt, als dass es hilfreich wäre. Angreifer gewinnen durch diese Fehlermeldungen hilfreiche Tipps! Mehr dazu unter » PHP mit Sicherheit

Offline (auf dem lokalen Webserver) und zum testen sollten die Fehlermeldungen allerdings auf jeden Fall angezeigt werden, weil oft nur so Fehler entdeckt werden, die von PHP nicht ausgebügelt werden können und somit unbemerkt zu Fehlfunktionen führen.

Der @ Operator unterdrückt in PHP 8 keine "Fatal Errors" mehr.

Das folgende PHP-Schnipsel zeigt Fehlermeldungen nur bei "localhost" an:

<?php
error_reporting($_SERVER["SERVER_NAME"] == "localhost" ? E_ALL : 0);
?>

Fehlermeldungen anzeigen und analysieren

Manche Webserver sind so konfiguriert das Fehlermeldungen nicht ausgegeben werden. Um nun den erstellten PHP-Code zu verbessern lassen Sie alle Fehlermeldungen bei der Entwicklung anzeigen.

<?php
error_reporting(E_ALL);
ini_set( 'display_errors', 'On' ); // Optional
?>

Es werden Fehlermeldungen vom Typ: E_ERROR, E_WARNING, E_PARSE und E_NOTICE angezeigt.

E_ALL - Zeigt alle Fehler, Warnungen und Benachrichtigungen an.
E_ERROR - Laufzeit-Fehler, die nicht behoben werden können.
E_WARNING - Laufzeit-Warnungen, das Skript wird nicht abgebrochen.
E_PARSE - Parser-Fehler (Syntax-Fehler).
E_NOTICE - Benachrichtigungen zur Laufzeit.
E_STRICT - Benachrichtigungen, ausgeführter Programmcode nicht mit zukünftigen PHP-Versionen kompatibel.

Fehlermeldungen analysieren:

// Array anzeigen
print_r($array);
var_dump($array);

// Gesendete POST-Variablen anzeigen
print_r($_POST);

// Gesendete GET-Variablen anzeigen
print_r($_GET);

// Eingebundene Dateien eines PHP-Scriptes anzeigen
$IncludeDateien = get_included_files();
print_r($IncludeDateien);

// Geladene Erweiterungen anzeigen
$GeladeneErweiterungen = get_loaded_extensions();
print_r($GeladeneErweiterungen);

// Alle aktuell definierten Variablen anzeigen
var_dump(get_defined_vars());

Alle definierten PHP-Funktionen anzeigen

MySQL Fehlermeldungen anzeigen:

// mysqli()-Funktion - Beispiel 1

// Die SQL-Anweisung immer in eine Variable schreiben
$sql = "SELECT * FRUM `gaestebuch`";

// SQL-Anweisung ausführen und etwaigen Fehler anzeigen
$datensatz = mysqli_query($sql) or die(mysqli_error() . $sql);


// mysqli()-Funktion - Beispiel 2

if (mysqli_query($sql)) {
 echo "OK";
}
else {
 echo "Fehler: " . mysqli_error() . $sql;
}
// PDO()-Funktion - Beispiel 1

if ($DB->query($sql)) {
 echo "OK";
}
else {
 echo 'Fehler: ';
 print_r($DB->errorInfo());
}


// PDO()-Funktion - Beispiel 2

try {
 $DB->query($sql);
 echo "OK";
}
catch (PDOException $e) {
 echo $e->getMessage();
}

Dieses PHP-Programm gibt (von MySQL) etwa folgende Fehlermeldung (auf englisch) zurück:

"You have an error in your SQL syntax. Check the manual that corresponds
to your MySQL server version for the right syntax to use near 'FRUM `linkliste`'
at line 1 ..."

Der SQL-String für die Datenbankabfrage ist fehlerhaft. Lassen Sie sich den fertigen String der entsprechenden Query vor der Anfrage testweise ausgeben.

Eine lange PHP oder SQL-Anweisung sollte in mehrere Zeilen aufgeteilt werden, erstens macht es die Anweisung übersichtlicher und zweitens wird bei einer Fehlermeldung die betreffende Zeile mit ausgegeben.

$sql = "SELECT 
          `vorname`,
          `name`,
          `strasse`,
          `hausnummer`,
          `plz`,
          `ort`,
          `vorwahl`,
          `telefon`
     FROM 
          `kunden` 
     WHERE 
          `ort` = 'Berlin' 
     ORDER BY 
          `name` DESC
     LIMIT 
          0,20";

➤ Wichtig ist, sich einen sauberen Stil im schreiben von PHP/MySQL anzueignen, dann schleichen sich weniger Fehler ein und gemachte Fehler findet man schneller.

Zu einer klaren Programmstruktur gehören auch begleitende Kommentare, die den Sinn von Programmierschritten auch noch längere Zeit nach der Erstellung nachvollziehbar machen. Die Fehlersuche oder eine Programmergänzung lassen sich so einfacher bewerkstelligen.

PHP Fehlermeldungen

Die Fehlermeldungen des PHP-Interpreters sind allgemein einer der nachfolgenden Kategorien zugeordnet:

➤ Mit Beginn von PHP 8 werden die Fehlermeldungen genauer, oft wird mitgeteilt welcher Fehler gemacht wurde.

Syntaxfehler (Parse Error)

Während der syntaktischen Analyse des Skriptes (englisch: parsing) wurde ein Fehler im Skript gefunden wie etwa ein fehlendes Semikolon am Ende einer Anweisung oder eine falsch gesetzte Klammer. Der Quellcode entspricht also nicht der erlaubten Grammatik (der Programmiersprache). Bei einem Syntaxfehler bricht der Interpreter die Verarbeitung des Programms ab.

Parse error: syntax error, unexpected ...
Das bedeutet meist das man ein Zeichen (z. B.: den Strichpunkt ;) vergessen hat.

Parse error: syntax error, unexpected T-STRING ...
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING ...
Bei solchen Fehlermeldungen sind meistens die Grenzen der Zeichenketten (Anführungszeichen) falsch oder nicht gesetzt.

Parse error: syntax error, unexpected $end in ...
Ein unerwartetes $end (steht für Ende des Programms), tritt beispielsweise auf, wenn eine (geschweifte) Klammer zu viel oder zu wenig notiert wurde.
Ab PHP 8 lautet diese Fehlermeldung: Parse error: Unclosed '{' on line 3 in ...

Parse error: syntax error, unexpected T_IS_EQUAL, expecting ',' or ')' in ...
Ein Komma-Fehler oder ein Klammer-Fehler wurde gefunden.

Parse error: parser stack overflow in ...
Der Hauptspeicher des Servers ist verbraucht. Haben Sie eine Endlosschleife im Script?

Parse error: syntax error, unexpected T_DOUBLE_ARROW in ...
Verwende bei der Zuweisung eines Arrays => anstelle von >=. Und beim vergleichen von Werten <= statt =< oder >= statt =>.

Parse error: syntax error, unexpected 'use' (T_USE) in ...
Das use-Schlüsselwort muss im äußersten Bereich einer Datei (des globalen Bereichs) oder innerhalb von Namespace-Deklarationen deklariert werden. Dies liegt daran, dass der Import zur Kompilierungszeit und nicht zur Laufzeit erfolgt, sodass er nicht blockiert werden kann.

Warnung (Warning)

Ein warnender Hinweis des Interpreters, dass er auf etwas Zweifelhaftes gestoßen ist. Dies kann beispielsweise ein Funktionsaufruf mit zu wenigen oder zu vielen Parametern sein. Bei Warnungen wird die Verarbeitung nicht unterbrochen; es kann aber zu falschen Ergebnissen kommen.

Warning: Wrong parameter ... for ...
Entweder werden zu viele Parameter oder falsche Parameter an eine Funktion übergeben.

Warning: Undefined variable: test in ...
Warnung tritt auf weil eine Variable ($test) nicht definiert ist.

Warning: Invalid argument supplied for foreach() in ...
Die foreach-Schleife erwartet ein Array.

Warning: Missing argument 2 for foo(), called in ...
Es fehlen ein oder mehrere Parameter bei der Funktionsausgabe.

Warning: date() expects at least 1 parameter, 0 given in ...
Es fehlen ein oder mehrere Parameter bei der Funktionsausgabe date().

Warning: Failed opening 'file.php' for inclusion ...
Tritt bei include() oder require() auf (einbinden einer Datei).
Entweder existiert die Datei nicht, oder die Pfadangabe ("../ordner/file.php") wurde falsch geschrieben. Siehe dazu: » 10 Regeln zu Dateinamen

Warning: Cannot add header information - header was already sent in ...
Aufrufe von header() (oder session_start(), setCookie()) müssen vor allen anderen Ausgaben an den Client (Browser) erfolgen. Es spielt keine Rolle, ob die Ausgabe durch einen HTML-Bereich vor dem Script oder durch das PHP-Script selbst entsteht. Dabei reicht als "HTML-Bereich" z. B. bereits ein einziges Leerzeichen vor dem öffnenden PHP-Tag aus.

Wenn die Datei als Zeichensatz UTF-8 verwendet, so muss im Editor „UTF-8 ohne BOM” ausgewählt werden.

Warning: Cannot send session cookie - headers already sent ...
Tritt bei Sessions auf. Meist liegt es daran das die Session nicht sofort in der ersten Zeile gesendet wurde (siehe vorherigen Absatz).

Warning: fopen("datei.txt","r+") - No such file or directory in ...
Warning: include(datei.php): failed to open stream: No such file or directory in ...
Die Datei, die das Script öffnen sollte, ist unter dem angegebenen Pfad nicht vorhanden.

Warning: ... failed to create stream(~failed to open stream) : Permission denied in ...
Die Datei oder das Verzeichnis besitzt keine Schreib.- und/oder Leserechte.
Siehe dazu: » Chmod - Schreib- und Zugriffsrechte

Warning: mail() has been disabled for security reasons in ...
Eine PHP-Funktion (mail()) wurde (vom Provider) aus Sicherheitsgründen deaktiviert.

Warning: Division by zero in ...
Diese Fehlermeldung ist eine Warnung die dann entsteht wenn PHP eine mathematische Aufgabe ausführen soll die ungültig ist -> zum Beispiel eine Division durch 0.

Warning: Supplied argument is not a valid MySQL result resource in ...
Diese Fehlermeldung kann kommen wenn keine Verbindung zur Datenbank hergestellt werden konnte.

Warning: Unknown error ...
Ein "unbekannter Fehler", dieser Fehler konnte nicht genau bestimmt werden.

Warning: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation 'like' in ...
Die Suche mit LIKE (%foo%) kann nur mit einer einheitlichen Sortierung (entweder utf8_unicode_ci oder utf8mb4_general_ci) in den Spalten der DB-Tabelle durchgeführt werden.

Schwerwiegender Fehler (Fatal Error)

Ein schwerwiegendes Problem wie etwa eine nicht deklarierte Funktion. Bei einem schwerwiegenden Fehler bricht der Interpreter die Verarbeitung des Programms ab.

Fatal error: Call to unsupported/undefined function ... on line ...
Entweder hat man eine selbst-definierte Funktion falsch geschrieben oder man verwendet eine Funktion die nicht (mehr) in der aktuellen PHP Version vorhanden ist oder (in der php.ini-Datei) deaktiviert wurde.

Fatal error: Maximum execution time exceeded
Gibt an das eine MAX Lauf-Zeit verstrichen ist. Das Script benötigt mehr CPU-Zeit, als ihm von der Serverkonfiguration her erlaubt wird. Ursachen: Datei zu groß, von einem anderen Prozess belegt oder schlicht gelocked (blockiert) und nicht wieder freigegeben.

Fatal error: Allowed memory size of **** bytes exhausted (tried to allocate **** bytes) in ...
Die Grenze des maximalen Speicherplatzverbrauch (im Arbeitsspeicher) eines PHP-Scripts wurde überschritten (haben Sie eine Endlosschleife im Programm?).

Fatal error: Cannot break from 1 loop(s) from nesting level 0
Wird eine Schleife in einer bereits mit include() eingeschlossenen PHP-Datei ausgeführt, so darf die Schleife nicht mit dem Befehl break; beendet werden.

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] ...
Die Verbindung zur Datenbank ist fehlgeschlagen. Überprüfen Sie, ob der Host, Benutzername und das Kennwort richtig eingegeben wurden.

Fatal error: Call to a member function prepare() on a non-object in ...
Der PDO-Funktion prepare() wurde kein Objekt (Datenbank-Verbindung) zugewiesen.

Fatal error: Uncaught Error: Call to a member function rowCount() on boolean in ...
Fatal error: Uncaught Error: Call to a member function fetchAll() on boolean in ...
Tritt in Zusammenhang mit einer Datenbank-Tabellen Abfrage auf, die verwendete Anfrage (SQL) ist fehlerhaft!

Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'field list' in ...
Diese Fehlermeldung ist eindeutig, MySQL enthält einen Fehler und gibt diesen an PHP (die PDOException) weiter.

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; ...
Diese Fehlermeldung ist eindeutig, MySQL enthält einen Fehler und gibt diesen an PHP (die PDOException) weiter.

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in ...
Diese Fehlermeldung tritt bei PDO - Prepare auf, wenn die Anzahl der übergebenen Variablen nicht passt oder fehlerhaft ist.

Hinweis (Notice)

Ein Hinweis oder Ratschlag des Interpreters, der meistens auf einen schlechten Programmierstil hinweist. So etwa wenn Variablen ausgegeben werden ohne ihnen vorher einen Wert zuzuweisen.

Notice: Use of undefined constant ...
Eine unbekannte Konstante wurde aufgerufen. Tritt auch auf wenn in einer Variable die Anführungszeichen vergessen wurden z. B.: $_POST[name] (Richtig wäre: $_POST["name"]).

Notice: Undefined offset: 2 in ...
Diese Meldung tritt meist im Zusammenhang mit der Verwendung von Arrays auf. Wenn ein Index-basierter Zugriff auf ein Array mit einem Index erfolgt, der größer ist, als die Anzahl der Elemente minus 1, dann erscheint diese Fehlermeldung. Mit isset() können Sie zuvor überprüfen ob der Index-Wert existiert.

Notice: A non well formed numeric value encountered in ...
Einen nicht wohlgeformten numerischen Wert angetroffen
Der numerische Wert enthält irgendwelche zusätzlichen Zeichen (Zeilenumbruch, Tabulator, etc.).

Notice: A session had already been started - ignoring session_start() in ...
Eine Session wurde bereits gestartet.

Notice: Undefined index: 13 in ...
Der Index-Wert ist in dem Array nicht vorhanden (z. B.: mit isset($arrayName[13]) überprüfen).

Missbilligt (Deprecated)

Wenn eine PHP-Funktion als missbilligt (engl.: deprecated) gekennzeichnet ist, diese könnte bei der nächsten PHP Version heraus fliegen!

Deprecated: Required parameter $arr follows optional parameter $prio in ...
(PHP 8) Wenn Variablen in eine Funktion übergeben werden, mussen zuerst die erforderlichen Parameter übergeben werden und dann die optionalen Parameter function ($vara, $varb, $varc=5).

Deprecated: Function ereg() is deprecated in ...
Die Funktion ereg() ist seit PHP 5.3.0 veraltet. Sich auf diese Funktion zu verlassen ist in keiner Weise empfehlenswert.
Der Ersatz für ereg() ist » preg_match - PHP Manual.

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in ...
Die PHP MySQL-Funktionen mysql_connect(), mysql_query(), etc. sind als missbilligt eingestuft (seit PHP 5.5.3 und wurden in PHP 7 entfernt). Verwenden Sie PDO (PHP Data Objects) oder mysqli().

Strenge Standards (Strict Standards)

Strict Standards: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CET/1.0/no DST' instead in ...
Ab PHP7 wird diese Meldung ausgeben:
Strict Standards: date(): We selected 'Europe/Berlin' for 'CEST/2.0/DST' instead in ...
Um die Zeitzone einzustellen verwenden Sie: date_default_timezone_set("Europe/Berlin"); » php.net/manual/de/timezones.europe.php

Weitere Fehlerquellen

• Falsche Anwendung einer PHP-Funktion — Schauen Sie beim deutschen » PHP-Manual vorbei.

• Eine bestimmte Browser-Funktionalität wurde abgeschaltet (z.B.: keine Speicherung von Cookies!)

• Umzug auf einen anderen Webserver — Manche PHP-Programme funktionieren dann einfach nicht mehr.

• Umstellung auf eine neuere PHP-Version oder Änderungen in der Datei "php.ini".

• Bestimmte PHP-Bibliotheken sind nicht vorhanden. Zum Beispiel die GD-Grafikbibliothek mit der man Grafiken erzeugen kann.

• Manche PHP-Programme sind auch abhängig von Daten die auf anderen Webservern liegen (Datenquelle vorhanden?, Ladezeit beachten, Datenformat wurde geändert, ...).

Leider enteckt man viele Fehler und Schwachstellen erst wenn die Homepage vom Testserver in die freie Wildbahn (ins Web) umgezogen ist.

Fazit

Der Entwicklungsprozess ist mit der Fertigstellung von PHP-Programmen längst nicht beendet. So führen Änderungen am Programmcode – sei es nun zu Erweiterungszwecken oder im Zuge einer "Optimierungsmaßnahme" – immer wieder dazu, dass Funktionen oder Methoden, die zuvor ausgetestet wurden und fehlerfrei funktionierten, plötzlich nicht mehr korrekt arbeiten. Auch kommt es vor, dass sich Änderungen, die bei der Beseitigung von Programmfehlern getätigt werden, auf andere Programmteile auswirken und somit an anderen Stellen im Code zu Fehlfunktionen führen.

Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel. — Fehlermeldungen gehören also nicht dazu

Um PHP-Scripte sicherer zu machen, lesen Sie den Artikel » PHP mit Sicherheit


Richtig debuggen

  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schon einmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben print_r();, var_dump() und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (die Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.