Wie verhindere ich "headers already sent by"?
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
zu unterbinden, gibt es grundsätzlich 2 Möglichkeiten.
- Die Ausgabe von Inhalten immer erst am Ende des Scripts machen.PHP - Code:
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:
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
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
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 ![]()
N43
Kommentare