Wie verhindere ich "headers already sent by"?

12.04.2008

Um mittels PHP eine Session zu starten, ein Cookie zu setzen oder direkt mit der header-Anweisung den Header verändern zu können darf noch keine Ausgabe erfolgt sein.

Der Browser empfängt nämlich neben der (HTML-) Datei auch noch weitere Informationen über die Seite (Cookies, Redirects), welche im Header mitgesendet werden.

Doch sobald eine Ausgabe über echo erfolgt, wird der Header-Block beendet und PHP beginnt das Dokument zu senden.

Um nun die Fehlermeldung

Zitat:
Warning: cannot modify header information - header already sent

zu unterbinden, gibt es grundsätzlich 2 Möglichkeiten.

  • Die Ausgabe von Inhalten immer erst am Ende des Scripts machen.
    PHP - Code:
     
    // hier den header verändern, z.B. mit
    session_start();
    // die Ausgabe kommt danach
     

    Diese Möglichkeit lässt sich aber nicht immer (oder nur unschön) implementieren. Möchte man z.B. ein Cookie nur unter bestimmten Umständen setzen, so ist Möglicherweise bereits eine Ausgabe erfolgt.
    Anderer Fall, gleiches Problem: Eine Funktion vor dem Setzen des Cookies löste eine Fehlermeldung aus, die an den Browser gesendet wird und wir bekommen wieder die ungewollte Meldung "headers already sent".

  • Output Buffering verwenden
    Aktiviert man mittels ob_start() den Output Buffer, so sendet PHP keine Ausgabe mehr an den Browser, sondern speichert sie in einem internen Puffer.
    PHP - Code:
     
    // am Anfang des Scripts
    ob_start();
    // und danach der Code des Scripts
     

    PHP gibt am Ende des Scripts automatisch den Inhalt des Ouput Buffers aus. Möchte man den Output Buffer vor dem Ende des Script an den Browser senden kann man ob_flush() oder ob_end_flush() verwenden.
    PHP - Code:
     
    ob_start();
    //Ausgabe
    echo "Hallo Welt";
    ob_flush()// Ausgabe ausgeben, output buffering bleibt aktiv
     
    // weitere Ausgabe
    echo "Und ciao";
    ob_end_flush(); // ausgeben und output buffering beenden (end)
     

almdudler777

19.05.2008
Author: almdudler777

auch beliebter und oft nicht erkannter fehler:

wenn diese Meldung auftaucht, guckt mal nach ob ihr in Dateien die ihr zuerst im Script included... z.B. bei mir immer ne DB Klassendatei wenn da nach dem letzten ?> nen Zeilenumbruch oder leerzeichen ist, wird dieses Bereits an den Browser geschickt => Headers sent... also immer hübsch dafür sorgen, das nach dem ?> nichts mehr kommt...

N43

21.05.2008
Author: N43

Hi,

danke für den Zusatz.

Das ist wirklich eine sehr gemeine Stelle, wenn man da nicht aufpasst. Wenn man dann ein älteres Script includiert kann so ein Fehler schon sehr verwirrend sein Smilie


N43

Einen neuen Kommentar erstellen...