| | | | |
| |||||||
KategorienArtikelWerkzeuge | AnsichtenHeaders already sentAus PHP.de Wiki
Header werden in verschiedenen Zusammenhängen gesetzt. Typische Anwendungen (und damit typische Aktionen, die diesen Fehler erzeugen) sind die Arbeit mit Cookies und Session(cookie)s, sowie versuchte Weiterleitungen über die header-Funktion. Auch Klassen und Scripte, die Header zur Unterstützung von bestimmten Zeichensätzen setzen oder damit Dateidownloads einleiten sollen, sind klassische Kandidaten.
FaustregelMerke: Der Begriff Ausgabe bezeichnet alle Daten eines Requests (nicht Scripts!), also die Gesamtheit aller Ausgabedaten, die durch die Kombination von Scripten via Include/Require entsteht. NegativbeispieleDie Angabe header header ('Content-Type: text/html; charset=utf-8'); steht nachfolgend exemplarisch für einen beliebigen Headeraufruf, auch für Funktionen, die einen solchen erzeugen, wie session_start oder setcookie. Typisch ist auch der Versuch, nach einer Ausgabe mit dem Location-Header umzuleiten. Quelltext / Bildschirmausgaben
Bsp. 1, Html vor der Headerausgabe <html> <head> <title /> </head> <body> <?php header ('Content-Type: text/html; charset=utf-8'); // more Code ?> </body> </html>
Bsp. 2, Html vor der Headerausgabe mit Include <html> <?php include ('script2.php'); ?> <head> <title /> </head> <body> Whatever happened to the eighties </body> </html>
Bsp. 2, Include (script2.php) <?php header ('Content-Type: text/html; charset=utf-8'); // more Code
Bsp. 3, Html vor der Headerausgabe mit Include <?php include ('header.html'); header ('Content-Type: text/html; charset=utf-8'); // more Code include ('footer.html');
Bsp. 3, Include (header.html) <html> <head> <title /> </head> <body> Für die Ausgabe ist nicht entscheidend, ob sie einem HTML-Format entspricht. PHP-seitige Ausgaben führen genauso genauso zum Fehler:
Bsp. 4, PHP-Ausgabe vor dem Header <?php echo 'Es funktioniert!'; header ('Content-Type: text/html; charset=utf-8'); echo '…nicht!'; ?> Typisch sind auch Folgefehler:
Bsp. 5, Headers sent als Folgefehler <?php // Führt zu einer Notice, wenn entspr. GET-Parameter nicht gesetzt ist: $test = $_GET['test']; // Notice: Undefined index: header ('Content-Type: text/html; charset=utf-8'); // Notice als Ausgabe führt zum Folgefehler Leerzeichen und anderer WhitespaceWichtig zu wissen ist, dass jedes Zeichen, auch Whitespace bereits als Ausgabe zählt:
Bsp. 6, Headers sent als Folgefehler <?php // erstes Zeichen ist ein Space header ('Content-Type: text/html; charset=utf-8'); // Notice als Ausgabe führt zum Folgefehler Byte-Order-Mark von signierten UTF-8-codiertem QuellcodeBesonders heimtückisch ist die Verwendung der Zeichencodierung UTF-8 mit BOM (Byte-Order-Mark, UTF-8-Signatur), die PHP nicht vernünftig verarbeiten kann und damit als Zeichen interpretiert. Aus einem
Bsp. 7, Headers sent durch BOM, Editoranzeige des Quellcodes <?php // erste Zeichen sind ein BOM (Script Header) header ('Content-Type: text/html; charset=utf-8'); wird dann ein
Bsp. 7, Headers sent durch BOM, Realer Inhalt des Scripts <?php header ('Content-Type: text/html; charset=utf-8'); // Headers sent Fehler und der Header schlägt fehl. Problematisch ist daran, dass die meisten Editoren dieses BOM kennen und aus dem Bearbeitungstext entfernen (nicht darstellen, oberes Beispiel). PHP scheitert dann daran, weil die Zeichenkette physisch aber eben existiert (unteres Beispiel). EmpfehlungenEs wird empfohlen, generell PHP-Scripte, denen kein Inline-HTML oder anderer Inline-Content folgt, ohne schließendes PHP-Tag abzuschließen. Also <?php // PHP Code // … // das entfernen: ?> Abschließende PHP-Tags sind für den PHP-Parser nicht relevant, das Weglassen verhindert aber wirksam, dass versehentliche Leerzeichen nach dem abschließenden ?> in einem Includeprozess zu einer Ausgabe vor einem Headeraufruf werden. |