So beheben Sie "Headers already sent" in PHP: Vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: "Sie haben bereits etwas auf den Bildschirm ausgegeben, und ich kann nicht"

\n

Wenn Sie jemals auf Ihrer Website statt einer schönen Seite einen weißen Bildschirm mit der erschreckenden Meldung Warning: Cannot modify header information - headers already sent gesehen haben – Sie sind nicht allein. Dies ist wohl einer der häufigsten Fehler unter Anfängern (und nicht nur) in der PHP-Entwicklung. Auf Stack Overflow hat diese Frage Hunderttausende von Aufrufen erhalten, und die Anzahl der Kopien fehlerhaften Codes weltweit wird in Terabyte gemessen.

\n

Die gute Nachricht ist jedoch, dass der Fehler "Headers already sent" kein Fluch ist, sondern lediglich eine strenge Erinnerung von PHP: "Hey, du hast bereits begonnen, HTML-Code zu senden, und versuchst jetzt, HTTP-Header zu ändern. Das geht nicht!".

\n

In diesem Artikel werden wir untersuchen, warum der Fehler headers already sent in PHP auftritt, wie man ihn findet und, am wichtigsten, wie man ihn ein für alle Mal behebt. Los geht's!

\n\n

1. Was sind HTTP-Header und warum sind sie "bereits gesendet"?

\n

Bevor wir in den Code eintauchen, lassen Sie uns einfach erklären, was "unter der Haube" passiert. Wenn ein PHP-Skript ausgeführt wird, sendet es zuerst die HTTP-Header an den Browser. Diese enthalten Dienstinformationen: Inhaltstyp (Content-Type), Cookies (Set-Cookie), Weiterleitungen (Location), Antwortstatus (200, 404, 301) und so weiter.

\n

Und erst nach allen Headern beginnt das Senden des Dokumentenkörpers – des HTML-Codes, den Sie auf der Seite sehen. PHP erlaubt es, Header nur bis zu dem Zeitpunkt zu ändern, an dem das erste Byte des Inhalts gesendet wurde.

\n

Sobald Sie etwas auf dem Bildschirm ausgeben (über echo, print, var_dump oder sogar nur ein Leerzeichen vor <?php), geht PHP davon aus, dass die Header bereits gesendet wurden. Jeder Versuch, header(), setcookie() oder session_start() danach aufzurufen, führt zu einem fatalen Fehler.

\n\n

1.1. Klassisches Beispiel für den Fehler

\n
<?php\necho "Hallo, Welt!";\n// Hoppla! Wir haben bereits etwas ausgegeben.\nheader("Location: https://example.com");\n// Warning: Cannot modify header information - headers already sent\n?>
\n

In diesem Beispiel sendet echo Text an den Dokumentenkörper. Danach kann PHP die Header nicht mehr überschreiben, um eine Weiterleitung durchzuführen. Das ist logisch.

\n\n

2. Top-5 Ursachen für "Headers already sent"

\n

Der Fehler kann nicht nur durch ein explizites echo verursacht werden. Hier sind die häufigsten Szenarien, die selbst erfahrene Entwickler erwischen:

\n
    \n
  • Leerzeichen oder leere Zeile vor <?php – der häufigste "Bug". Wenn in der Datei vor dem öffnenden Tag auch nur ein Leerzeichen steht, wird es an die Ausgabe gesendet.
  • \n
  • Unsichtbare BOM-Zeichen (Byte Order Mark) – die Datei wurde in der Kodierung UTF-8 with BOM gespeichert. Die ersten 3 Bytes (EF BB BF) werden als Ausgabe betrachtet.
  • \n
  • Ausgabe aus eingebundenen Dateien – in der Datei config.php befindet sich ein zusätzliches Leerzeichen nach ?>.
  • \n
  • Fehler und Warnungen – wenn PHP eine Warnung ausgibt (z. B. über die Verwendung einer undefinierten Variablen), gilt dies ebenfalls als Senden von Inhalt.
  • \n
  • Funktionen print, printf, var_dump vor header() – jede Ausgabefunktion zerstört die Header.
  • \n
\n\n

3. So finden Sie die Fehlerquelle: 3 Methoden

\n

Bevor Sie den Fehler beheben, müssen Sie herausfinden, woher die "zusätzliche" Ausgabe stammt. Verwenden Sie eine dieser Methoden.

\n\n

3.1. Anzeige aller Fehler aktivieren

\n

Fügen Sie am Anfang des Skripts (vor jeder Ausgabe) hinzu:

\n
<?php\nerror_reporting(E_ALL);\nini_set('display_errors', 1);\n?>
\n

PHP zeigt oft die genaue Zeile an, in der die Ausgabe erfolgte. Suchen Sie nach einer Meldung wie Output started at /path/to/file.php:12.

\n\n

3.2. Verwenden der Funktion error_get_last()

\n

Sie können den letzten Fehler abfangen

Blogs

Buchempfehlungen