Colorscheme

Cannot modify header information – headers already sent – gehasster PHP-Fehler


Jemand der mit PHP schonmal seinen Header modifiziert hat, wird diesen Fehler sicher schonmal bekommen haben: Cannot modify header information – headers already sent. Meist beginnt nun eine frustrierte Fehlersuche, zumal man anfangs nicht mal weiß was dieser Fehler genau bedeutet (mir ging es ähnlich) und darum will ich hier mal versuchen den “Cannot modify header information“-Fehler zu erläutern und Tipps zur Lösung bzw. zur Vermeidung des Problems geben (Tipps und Anregungen um diesen Artikel noch hilfreicher zu machen bitte in den Kommentaren posten).

Wie entsteht dieser Fehler
Wenn man mit PHP zum Beispiel auf eine andere Seite weiterleiten will, kann man dies über eine Modifizierung des Headers machen. Man verändert also Daten, die nicht zur eigentlichen Ausgabe von HTML gehören. Allerdings ist es wichtig das alle Modifizierungen am Header gemacht werden, bevor auch nur ein Zeichen HTML-Code ausgegeben wird. Ihr könnt also euren Header in mehrern Dateien bearbeitet und ändern und ihn dann abschicken, so lange ihr vorher kein Zeichen HTML-Code ausgegeben habt.

Jetzt fragt ihr euch sicherlich wie das denn nun passieren kann, das der Header vorher abgeschickt wird. Sobald der PHP-Compiler auf eine HTML-Ausgabe stößt, schickt er als erstes den Header ab und fängt dann an den HTML-Code auszugeben. Das ist definitiv richtig und gut, doch dadurch können sich schnell Fehler einschmuggeln, denn schon ein einzelnes Leerzeichen an der falschen Stelle kann zum unbeliebten Cannot modify header information-Fehler führen.

Kurz zusammengefasst: Header modifzieren so oft ihr wollt, dann erst HTML ausgeben.

Wodurch wird der Header-Fehler am häufigsten erzeugt

  • Leerzeichen – dies dürfte der absolute Spitzenreiter sein, ein Leerzeichen welches sich eingeschmuggelt hat und PHP dazu “zwingt” den Header früher zu verschicken als gewünscht
  • echo/print – mit diesen beiden lassen sich HTML-Ausgaben innerhalb von PHP erzeugen. Natürlich wird dadurch auch der Header gesendet
  • Fehlermeldung – Fehlermeldungen sind gut, doch wenn sie nicht in eine Log-Datei geschrieben werden, sondern im Browser ausgegeben werden, zählen sie wiederum als HTML und der Header ist auch in diesem Falle futsch

Den Fehler finden
Wie schon oben angedeutet ist ein “eingeschmuggeltes” Leerzeichen der häufigste Fehler und in 90% der Fälle der Grund für ein Cannot modify header information – headers already sent, darum sollte man sich erstmal damit beschäftigen.
In der Fehlermeldung werden in der Regel zwei PHP-Dateien angegeben wodurch der Fehler aufgetreten ist, diese öffnet ihr als erstes und schaut nach ob vor und nach euren PHP-Start- und Schließtags Leerzeichen oder Leerzeilen sind, diese müsst ihr dann entfernen:

Das Leerzeichen in diesem Beispiel ist schwer zu erkennen und genau das macht diesen Fehler so tückisch: In euren PHP-Dateien könnte dies auch der Grund für den Header-Fehler sein.

Sollte dies den Fehler nicht beheben dann prüft euren Code nach Ausgabe die mit “echo” und “print” erzeugt werden. Bei mir lag der Fehler zum Beispiel daran, das ich ein Codebeispiel verwendet habe, indem ein “echo” platziert war. Sucht also in eure eigenen PHP-Dateien und in den Scripten die ihr einbindet nach “echo” oder “print”-Ausgaben. Das gleiche gilt für Fehlermeldungen die ihr direkt im Browser ausgebt.

Ein Template-System schafft Abhilfe
Um die Ausgaben an geordneter Stelle zu tätigen, also nachdem alle Dateien den Header nach ihren Anliegen modifiziert haben, empfiehlt sich der Einsatz eines Template-Systems. Dadurch könnt ihr eure Ausgaben abspeichern und erst später ausgeben. Ihr behaltet durch das Template-System die Übersicht und könnt Fehlermeldungen und dergleichen dennoch innerhalb der Dateien erzeugen, an das Template-System weitergeben und dann zum Schluß ausgeben.

Zusatz zum Header-Problems
Oliver hat mich in einem Kommentar darauf aufmerksam gemacht, dass man auch erstmal alle Ausgaben in einen Ausgabepuffer schreiben kann und erst nachdem man quasi alles hinzugefügt hat, den Ausgabepuffer leert. Mehr dazu hier: PHP ob_start-Manual.

[UPDATE - 05.12.] Wieder 30 Minuten meines Lebens verloren auf der Suche nach der Ursache für den Headers already sent Fehler:
header-sent-error2.png

Wie man vielleicht sieht, sind nach der PHP Anweisung noch Leerzeilen, Gott weiß wie die da hingekommen sind, als ich aber gerade in einem anderen Bereich den Fehler bekam, ging es erstmal auf die Suche nach der Ursache. In der Fehlermeldung wurde mir auch das besagte Script angegeben, doch auch beim dritten durchsehen konnte ich den Fehler nicht finden, wer denkt auch schon an sowas wie Leerzeilen unterhalb der PHP-Anweisung…

Übrigens, wer auf der Suche nach einem einfachen PHP Tutorial ist, findet hier ein kostenloses im PDF und Online-Format: PHP Tutorial als PDF


Verwandte Artikel
  1. Eigenes WordPress Template in wenigen Schritten – Schritt 3
  2. Höher im Ranking – WordPress-Titel-Formatierung
  3. Webdesign Guide – Awakening the biest
  4. 10 Webdesign Fehler
  5. Du benutzt noch reines Html für deine Website? Befehl: WEITERLESEN!!

am Juli 19, 2006 um 12:17 Uhr | in Webdesign | 38 Kommentare

4 Trackbacks/Pingbacks
  1. Pingback: Webdesign Guide - Awakening the biest » Webdesignblog on Dezember 4, 2006
  2. Pingback: mysql fehler mysql_fetch_assoc(): - TYPO3forum.net on September 3, 2007
  3. Pingback: richard-heider.de » Upgraded WordPress on Juli 27, 2008
  4. Pingback: Cannot modify header information - headers already sent on Oktober 10, 2008

34 Kommentare
  1. Oliver, Juli 19, 2006:

    Kurz zusammengefasst: Header modifzieren so oft ihr wollt, dann erst HTML ausgeben.

    oder man nutzt die [link=http://www.php.net/manual/de/function.ob-start.php]Ausgabepufferung[link]

    mfg Oliver

  2. Christian Strang, Juli 19, 2006:

    Hi Oliver,
    danke für den Hinweis! Werde es noch hinzufügen.

  3. Tom, Februar 15, 2007:

    Also jeder weiß wie es ist, wenn so ein Fehler angezeigt wird und man null Ahnung hat, warum. Bei mir waren es 2 Leerzeilen in der Wp-config-Datei nach der letzten Klammer (>). UND DARAUF wäre ich NIE(!!!!) gekommen, ohne diesen Artikel hier. Also tausend Dank, ein Tipp der mir ne Menge Ärger erspart und das Wochenende gerettet hat.

    Tom

  4. Sebastian, April 11, 2007:

    Ich hab ein bisschen mit dem code beispiel zur html-authentifizierung von php.net herumgespielt – dabei konnte ich den im artikel beschriebenen Fehler reproduzieren, wenn ich:
    1) die PHP-Datei nicht ASCII sondern UTF-8 encoded abgespeichert habe oder
    2) vor der Abfrage “if(!isset [...]” ein require Statement aufgenommen habe.

    In beiden Fällen kam die ungeliebte Fehlermeldung. Vermeidet man beides funktioniert – allerdings weiß ich nicht warum das so ist…

    Hier das Code-Beispiel:

    if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header(‘WWW-Authenticate: Basic realm=”LOG::IN”‘);
    header(‘HTTP/1.0 401 Unauthorized’);
    echo ‘Bitte loggen Sie sich ein!’;
    exit;
    } else {
    echo “<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>”;
    echo “<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>”;
    }

  5. Sebastian, April 11, 2007:

    “Vermeidet man beides funktioniert ES” muss es heißen *sorry* – das folgende Beispiel gibt – wegen der require Anweisung – die besprochene Fehlermeldung aus…

    <?php

    require “test.inc”;

    if (!isset($_SERVER[’PHP_AUTH_USER’])) {
    header(’WWW-Authenticate: Basic realm=”LOG::IN”‘);
    header(’HTTP/1.0 401 Unauthorized’);
    echo ‘Bitte loggen Sie sich ein!’;
    exit;
    } else {
    echo “<p>Hello {$_SERVER[’PHP_AUTH_USER’]}.</p>”;
    echo “<p>You entered {$_SERVER[’PHP_AUTH_PW’]} as your password.</p>”;
    }

    ?>

    LG Sebastian

  6. combie, Mai 12, 2007:

    Eine gemeine Falle: Die Unicode BOM !
    Klebt unsichtbar am Anfang der Datei und verursacht eine ungewollt Ausgabe. Wollen wir mal hoffen, daß PHP6 Besserung bringt.

  7. Arno Simon, August 5, 2007:

    Eine weitere mögliche Fehlerquelle habe ich hier beschrieben:

    http://www.bot-trap.de/forum/index.php?topic=3262.msg31130#msg31130

    vG

    Arno

  8. Lehmann, Olaf, August 7, 2007:

    hey christian, da kann ich nur sagen: danke mann. hast mir ‘ne menge zeit mit suchen erspart.

    mfg

  9. Edgar, Oktober 29, 2007:

    Solche Infos müssten halt öfter zu finden sein. Das spart ja Stunden Sucharbeit und Frust. 1000 DANK!
    Bei mir war es auch die leere Zeile nach dem ?>

  10. mark, November 8, 2007:

    Sollte man alles durchsucht haben, aber immer noch die Fehlermeldung erhalten, das in Zeile 1 etwas ausgegeben wird, wobwohl

  11. mark, November 8, 2007:

    Sollte man alles durchsucht haben, aber immer noch die Fehlermeldung erhalten, das in Zeile 1 etwas ausgegeben wird, wobwohl (eckige klammer)?php ganz vorne steht und davor nix kommt, kann es auch sein das ein unicode zeichen in der Datei enthalten ist. Wenn man sich die Datei mal im HEX Editor ansieht findet man möglicherweise ein paar Zeichen die dort nicht hingehören. so erging es mir und nach 2 Std suchen habe ich diese Seite gefunden:

    http://www.tippscout.de/php-fehlermeldung-headers-already-sent_tipp_3136.html

    alles wird gut! :)
    ( meinen Beitrag davor bitte löschen. dein Blog mag den php header nicht :)

  12. Whesley, November 21, 2007:

    Danke für deinen Beitrag. Ich hatte auch ein paar Zeichen vor dem PHP und den heiß geliebten Fehler! Danke! :)

  13. Ramzi, Januar 27, 2008:

    Danke für den Hinweis mit den Lehrzeilen!! Alleine hätte ich nie rausgefunden!! ;) weiter so!

  14. helmeloh, Februar 4, 2008:

    War nützlich, danke. (:-) Habe wegen einem Leerzeichen einige Zeit herumgesucht.

  15. Cognac, Februar 20, 2008:

    Moin,
    ich habe noch eine kleine Ergänzung (als Resultat von 10 Minuten Ärger):
    Mein Fehler wurde immer in Zeile 60 angezeigt, obwohl mein Code nur 58 Zeilen lang ist (dort befindet sich dann das abschließende ?>
    Danach folgten definitiv keine Leerzeichen oder gar -zeilen! Trotzdem wurden zwei Zeilen zuviel gezählt. Meine Lösung:
    Mein Editor kennt 3 Zeilenumbruchformate (Mac, Unix, Win), besagte Datei war auf Unix eingestellt, der Wechsel zu Win sorgte dann wieder für das Funktionieren des Programmes! Ehrlich gesagt finde ich die Suche nach solchen Dingen fast schon pervers, als Programmierer hat man eigentlich besseres zu tun :o)

    Gruß Cognac

  16. XIV, April 4, 2008:

    Echt suuuper Sache hier. Wenn man sich ewig durch nen Fachdschungel für programmier-pseudo-intellektuelle Fachidioten durchgewühlt hat und sich entweder ihre blöden Kommentare ansehen muss, oder das chinesisch versucht zu übersetzen… und dann zu deinen Erklärungen kommt… ich muss schon sagen.. Habs beim ersten mal verstanden und musste nicht extra nen Software-Duden rausholen. Respekt und weiter so.. DU tust der INet-Gemeinde wirklich einen Gefallen mit deinem Talent zu erklären. RESPECT!

  17. Chris, April 4, 2008:

    *g na das ist mal ein Lob was ich mir einrahmen würde, bin froh das ich helfen konnte :)

  18. vinumlatinum, Mai 19, 2008:

    Vielen Dank, hat mir sehr viel Ärger erpart xD

  19. Luke, Juni 3, 2008:

    Danke ;)
    Hast mir echt sehr geholfe ;)

    Leerzeichenfehler O-)

  20. bGeissl, Juni 11, 2008:

    habe die wp-config.php des WordPress-Blogs mit dem Microsoft Editor bearbeitet. Dadurch wurde die wohl automatisch als Unicode abgespeichert. Habe dann mit dem Context-Editor die Codierung auf MS-DOS gesetzt und es lief! Der Context-Editor ist eh besser, weil der sich bei großen Texten (Flatfiles) nicht aufhängt und sowieso viel mehr kann (z. B. Syntaxhervorhebung).
    Danke + Gruß

  21. Matthias Fax, Juni 17, 2008:

    Ich hatte den selben Fehler, weil ich versucht habe einen Cookie nach einer Funktion, die HTML-Code mit echo schreibt, zu setzen.
    Dieser Beitrag brachte mir dann die Lösung.

    Vielen Dank

  22. goban, Juni 30, 2008:

    ja ich habe auch ein cookie versucht zu setzen. dank diesem thread hab ich den fehler gefunden. :)

  23. Dürrbi, August 12, 2008:

    Danke für den Tipp mit den Leerzeichen…..

    Was habe ich mir vorher den Wolf gesucht :-(

  24. Cognac, September 5, 2008:

    Hehe, habe wieder anfangen wollen nach dem Fehler zu suchen und wußte, daß es nichts mit Leerzeichen zu tun hat. Geholfen hat mir dann mein eigenes Posting hier vom 20. Februar. Danke Cognac *g*

  25. Leo (Schnäppchenfuchs), September 20, 2008:

    Hi,
    vielen Dank!! Zusammen mit Google war das eine Problemlösung in einer Minute. Bei mir war es ein Leerzeichen

  26. Nico, Oktober 27, 2008:

    Super Artikel, lag an einem Leerreichen vor dem

  27. bibo, Oktober 31, 2008:

    Thx – bei mir hatten sich auch Leerzeichen untergeschlichen…
    Habe diese bemerkt als ich Strg + A gedrückt habe und nach dem End-Tag noch einiges mehr markiert war….

    Mfg

  28. Sascha, November 25, 2008:

    Ich hab leider nicht so viel zeit mir hier alles durchzulesen, deswegen gehe ich jetzt auch mal die gefahr ein, diese möglichkeit doppelt zu schreiben!

    Eine ganz simple variante ist es auch, die php-datei mit den geänderten headern einfach über ein iframe einzubinden an die stelle wo man ihn braucht

    ;-)

  29. nikosch, Dezember 3, 2008:

    Deswegen wichtigster Tipp:

    Am Ende des Scripts die ?> weglassen! PHP braucht die nicht, Zend hats sogar im om Coding Standard.

  30. nikosch, Dezember 3, 2008:

    PS: Tipp 32 entbehrt dagegen jeglichen Zusammenhangs.

  31. Christian Bommer, Dezember 10, 2008:

    Danke für den Artikel. Auch kleine unwichtige Meldungen in der Entwicklungsumgebung bei error_reporting(1) erzeugt den “Cannot modify header information”-Fehler.

  32. Ralf, Dezember 21, 2008:

    Danke Christian,

    Du hast mir gerade viel Arbeit gespart (Leerzeile hint ?>).

  33. Roman, Januar 9, 2009:

    Einfache Lösung:
    PHP Datei in “UTF-8 ohne BOM” konvertieren!!! Am besten mit Notepad++. Format–> Konvertieren…

  34. Sammy, Januar 21, 2009:

    DANKE! DANKE! DANKE!

Tut mir leid, die Kommentarfunktion für diesen Beitrag ist geschlossen.