Auf das Problem mit PHP headers already sent trifft man früher oder später. Doch was verbrigt sich hinter diesem Fehler und was kann man gegen ihn machen?
Problem: Headers already sent
Durch Umstellungen der PHP-Version, des error_reporting oder auch nur durch eigenes Verschulden beim programmieren von PHP-Scripten kann es plötzlich zu der Meldung: "Can not add header information - headers already sent" kommen.
Grund der Fehlermeldung
Die Fehlermeldung tritt auf, wenn man versucht nach einer Ausgabe durch echo, print, print_r und ähnlichen PHP-Funktionen, die PHP-Funktion header aufzurufen.
Warum passiert das aber? Weil durch das HTTP-Protokoll bestimmend, zuerst der HTTP-Header gesendet wird und dann der Content. Wenn man aber nun eine Ausgabe produziert, so ist diese der HTTP-Content. Logischerweise kann man danach nicht mehr einen HTTP-Header senden - was ja aber mit der Funktion header() erreicht werden soll.
Beachte
Achtung: Einer der häufigsten Gründe für die Fehlermeldung: "headers already sent" sindt meist ein oder mehrere Leerzeichen/Tabs vor den PHP Tags oder .
Lösung
Neben dem schnöden Auffinden der produzierenden Zeile durch die Fehlermeldung, gibt es zwei mir bekannte Herangehensweisen, um das Problem zu lösen.
Zum einen kann man vorher mit headers_sent() prüfen, ob schon ein HTTP-Header gesendet wurde. Die Funktion gibt einen Wahrheitswert (boolean) zurück, somit kann man mit einer vorgestellten if-Bedingung auf gesendeten Header prüfen und dementsprechend reagieren.
Die andere Möglichkeit ist, den PHP-Code mit der Art wie in Listing 1 gezeigt einzurahmen.
Listing 1
Download Code!
ob_start(); // Starten den Ausgabepuffer ob_start(); // Nochmal um einen Rahmen zu bilden // Supertoller PHP-Code
// Noch mehr supertoller PHP-Code
Wichtige Anmerkung zur Lösung mit dem Ausgabepuffer
Was hat das mit dem Rahmen auf sich? Ganz einfach. PHP nutzt für Sessions standardmäßig eine Funktion um an die URLs eine Session-ID anzuhängen, falls PHP kein Cookie setzen kann. Wird das ohne Rahmen gemacht, funktioniert das automatische Anhängen der Session-ID nicht mehr.