24.06.2015, 00:43
Dieser Beitrag wurde zuletzt bearbeitet: 24.06.2015, 08:17 von Arne Drews.
Warning: Cannot add/modify header information - headers already sent
Ein Klassiker unter den unverhofften PHP-Warnungen.
Was ist passiert?
Diese Warnung tritt i.d.R. auf, wenn versucht wird, den HTTP-Header zu modifizieren, nachdem bereits Dokumenten bezogene Inhalte an den Browser gesendet wurden.
Oft fällt einem dies im ersten Moment gar nicht mal auf, denn die Ursache für die Warnung ist vielfältiger, als manch einer denkt.
Um das prinzipiell verständlich zu machen, stellen wir das Problem auf einfachste Weise mal nach:
PHP-Code:
.<?php
header ( 'Content-Type: text/html; Charset=utf-8;' );
<?php
soll hier mal ein einfaches Leerzeichen darstellen ( gibt der Editor leider bzw. Gott sei dank nicht her, daher als Beispiel der Punkt ), also für einen unerfahrenen User kaum als wirkliche Ausgabe zu erkennen.Dennoch ist dies eine Zeichen bereits eine Ausgabe, die an den Browser gesendet wird. Und genau dies kann der folgenden Funktion
header(...);
zum Verhängnis werden, denn die kann den HTTP-Header nicht mehr verändern, da die Ausgabe bereits einen eigenen HTTP-Header gesendet hat.Das Problem tritt also tatsächlich nicht nur bei der Verwendung von
header()
auf, sondern bei allen Funktionen, die den HTTP-Header modifizieren.Folgende häufig verwendete PHP-Funktionen zählen u.a. zu diesen:
header()
session_start()
session_regenerate_id()
setcookie()
setrawcookie()
Doch PHP bleibt beharrlich und meldet weiterhin dieselbe Warnung?! Der Grund dafür ist mit hoher Wahrscheinlichkeit dann...
Die Unicode-Falle
Die Verwendung von Unicode - allen voran
UTF8
- ist heutzutage Quasi-Standard, wenn es bspw. um CharsetEncoding von Webprojekten geht.Viele Editoren oder IDE's speichern die Daten im
UTF8
-Modus. Genau hier muß man aber aufpassen, daß man nicht nur UTF8
, sondern UTF8 ohne BOM
( ByteOrderMark ) verwendet!Das ByteOrderMark ist eine Kennung für die Unicode-Kodierung, die den Datenstrom einleitet und im Falle von
UTF8
aus der Bytesequenz EF BB BF
besteht.Das wird in Browsern häufig als  interpretiert und ausgegeben ( im Quelltext des Browsers erkennbar ).
Daher Dateien immer
UTF8 ohne BOM
speichern!