Häufiger PHP-Error: „Cannot modify header information – Headers already sent…“

PHP-Newbies werden den Fehler bzw. die Warnung sicherlich zu Gesicht bekommen:

Warning: Cannot modify header information – headers already sent by (output started at C:\…\:N ) in C:\…\ on line N

Für Anfänger ist es meist nicht leicht den Fehler zu deuten und zu beheben, denn es wird etwas Hintergrundwissen zum Ablauf einer Anfrage von einem Client an den Server benötigt.

Schnelle Anleitung zur Fehlerbehebung »

Übertragung der Daten

Die oben genannte Fehlermeldung wird vom PHP-Parser erzeugt, wenn versucht wird HTTP-Header-Daten zu senden, obwohl bereits Body-Daten gesendet wurden. Nachdem ein Client (z.B. ein Webbrowser) eine HTTP-Anfrage auf eine Webseite stellt, gibt der Server eine HTTP-Antwort. Anfrage als auch Antwort bestehen aus zwei Teilen: Header (Kopf) und Body (Körper) der Sendung.

Im Header stehen Hintergrundinformationen und Kopfdaten zur aktuellen Übertragung. Er steht immer am Anfang.

Im Body wird der eigentliche Inhalt der Anfrage bzw. Antwort übertragen. Er folgt auf den Header.

Entstehung des Fehlers

Wie erwähnt, stehen Header-Daten immer am Anfang einer HTTP-Übertragung. Sollte versucht werden im Body solche Daten zu senden, wird ein Fehler ausgegeben.

In PHP ist die Sendung von Header-Daten durch z.B. die Funktion header() möglich. Wird sie nach der Sendung jeglicher Body-Inhalte aufgerufen, so erscheint der bekannte “Warning: Cannot modify header information – headers already sent“-Fehler. Zu Body-Inhalten zählen etliche Arten von Ausgabe, die durch beispielsweise der Anweisung echo erzeugt werden.

Fehlerbehebung

Zur Behebung des Fehlers müssen alle Ausgaben, die vor dem Aufruf einer header-Funktion getätigt werden, gelöscht oder hinter die Funktion gesetzt werden.

Folgende PHP-Funktionen fügen Header-Daten hinzu oder ändern sie:

  • header()
  • setcookie()
  • session_start()

Folgende PHP-Beispiele würden einen Fehler ausgeben:

  • <?php
    echo "Hallo Welt!"; // Hier erfolgt eine Ausgabe durch "echo"
    setcookie("hallo", "gesendet");
    ?>
  •  <?php // Hier erfolgt eine Ausgabe, da sich ein Leerzeichen vor "<?php" befindet
    session_start();
    ?>
  • <?php
    echo "Weiterleitung..."; // Hier erfolgt eine Ausgabe durch "echo"
    header("Location: datei.php");
    ?>
  • <html> <!-- Hier erfolgt Ausgabe durch HTML-Code -->
    <head><!-- Hier erfolgt Ausgabe durch HTML-Code -->
    <?php
    session_start();
    ?>
  • Falsches Abspeichern einer Datei kann den Fehler ebenfalls auslösen. So darf eine PHP-Datei nicht im Zeichensatz UTF-8 mit BOM abgespeichert werden, da somit ein nicht sichtbares Zeichen an den Beginn der Datei eingefügt wird, wodurch es zur frühzeitigen Ausgabe kommt. Mit dem freien Editor NotePad++ lässt sich eine Datei leicht in UTF-8 ohne BOM sichern, anders als mit Phase 5 oder Windows Editor.

Das Problem kann durch Versetzung oder Löschung des Ausgabe-Codes, Buffern der Ausgabe oder Löschung der header-Funktion gelöst werden. Beispiele für PHP-Codes, die keine Warnung erzeugen, sind:

  • <?php
    session_start();
    echo "Hallo Welt!";
    ?>
  • <?php
    $output = "Hallo Welt!";
    setcookie("counter", "counted");
    echo $output;
    ?>
  • <?php
    ob_start();
    echo "Umleitung...";
    header("Location: index.php");
    ob_flush();
    ob_end_clean();
    ?>

    ob_***-Funktionen kontrollieren den Output-Buffer und können die Ausgaben aufschieben.

Um zu erkennen, wo sich eine verfrühte Ausgabe befindet, bietet die PHP-Fehlermeldung eine Datei- und Zeilenangabe: …(output startet at C:\…\datei.php:123)…

Die Datei und die Zeile, in welcher eine header-Funktion benutzt wird, steht am Ende der Meldung: … in C:\…\datei.php on line 123

Dieser Artikel wurde vertaggt mit , , , , , , .
Kategorien: Grundwissen, PHP

Hat Ihnen dieser Artikel gefallen? - Dann abonnieren Sie vlblog um über neue Themen rund ums Web informiert zu werden.

Ein Kommentar zu “Häufiger PHP-Error: „Cannot modify header information – Headers already sent…“”

  1. John sagt:

    Unleitung auf einen Microcontroller im Netz der Wetterdaten in HTML ausgibt.
    Mangels fester IP leite ich dynamich per php um

    Jetzt funzt es auch.

Hinterlasse eine Antwort