Üble Falle in Blogs – Cannot modify header information

Eine Blog-Fehlerfalle, in die man schnell kommt

Dieser Artikel hat seinen Ursprung auf Grund einer Fehlermeldung, die ich für einen Kollegen suchen musste! Plötzlich hat der Blog nicht mehr funktioniert! Natürlich: „Ich hab doch gar nichts gemacht“! Aber plötzlich…..
Der Fehler, der kam war

Warning: Cannot modify header information – headers already sent by (output started at Dateiname:208) in Dateiname on line 57

Wie kann man diesen Fehler finden?

PHP-Syntax-Fehler

Was hier im Blog aufgetreten ist, ist ein Syntaxfehler in der PHP-Programmierung des Blogs!

Man kann in PHP direkt HTTP-Requests absenden. Dies sind Anweisungen wie z.B. erzwungene Sprünge auf bestimmte Seiten etc. Sie werden in PHP mit der Funktion header() programmiert. So kann man an jeder Stelle des Programms mit

header(„Location: „.“http://IhreSeite?Param1&Param2…“);

eine andere Seite aufrufen. Man benutzt dies, um eine Seite z.B. im Fehlerfall aufzurufen und anzuzeigen.

Auch werden Cookies, die man in PHP setzen kann, mittels HTTP-Requests abgesetzt. Für alle diese Funktionen gilt, dass diese Funktionen nur dann aufgerufen werden dürfen, wenn auf der Seite, die ausgegeben werden soll, noch keine Ausgabe gemacht wurde.

Und genau das ist hier der Fehler: Es soll ein HTTP-Request (hier leider als „modify header information“ benannt) abgesendet werden, aber es wurde auf der Seite schon eine Ausgabe gemacht!

Und wie kommt so was?

Entweder man schreibt wirklich was auf die Seite, bspw. mit der PHP-Funktion print oder echo! Dann lässt sich das aber eigentlich schnell finden!
Gemeiner ist der folgende Fall:

  $i = 2048;
  $j = 4096;
>?
      

Sie sehen die Leerzeile hinter der Umschaltung mit >? ?

Da hier von PHP auf HTML umgeschaltet wurde, wird die Leerzeile in der Datei als HTML-Ausgabe ausgegeben und somit ist eine Ausgabe im Sinne des HTTP-Requests erfolgt und die Fehlermeldung wird folgen. Ziemlich mistig, gelle!

Wer suchet, der findet

Wie kommt man aber nun auf so einen Fehler? Sie werden zugeben, dann man diesen leicht einbauen kann, wenn man z.B. mal in das WordPress-Coding schaut und nicht aufpasst, eine Datei des WordPress-Codings nur dann zu speichern, wenn man das Coding wirklich verändern will, bspw. um englische Texte in deutsche zu verändern. Schnell ist am Dateiende ein Blank gesetzt und keiner kann sich mehr erinnern.

Aber man bekommt in der Fehlermeldung ja Hilfe: Schauen Sie sich die Fehlermeldung an: (output started at Dateiname:208)
Auf der Zeile 208 in der Datei Dateiname ist die Zeile aufgezeigt, wo eine Ausgabe gemacht wurde. Diese Zeile stimmt, denn PHP kann zählen.

Die meisten Editoren, wie Notepad+, PsPad etc. haben eine Zeilenangabe, wenn man zumindest den Cursor auf die Zeile stellt. Dann kann man diese üblen Fehler finden. Er wäre auf der Zeile 208 in unserem Beispiel. Man löscht also dort die Leerzeile:

  $i = 2048;
  $j = 4096;
>?

und schon ist der Fehler weg.

Wenn alle Stricke reißen

Falls man den Fehler so nicht findet, kann man sich mit folgendem Coding, das man überall ins PHP-Coding einbauen kann, langsam zum Fehler vorhangeln.

if(headers_sent($f,$l)) die(‚headers already sent in ‚.$f.‘ at line‘.$l);

Bei eigenen Programmen, die man schreibt, ist es günstig, wenn man sich eine eigene Funktion in PHP schreibt, die z.B. folgendermaßen aussehen könnte.

function check_headersent() {
   if(headers_sent($f,$l))
    die(‚fehlerhafte Ausgabe für header in ‚.$f.‘ at line‘.$l);
}

Stellt man diese Funktion zusammen mit anderen in eine Datei z.B. goodies.php, kann man in jedes Programm diese Datei mit include einbinden und schafft sich so, kleine Diagnose- oder Hilfsprogramme, die immer vorhanden sind.

Sie sehen, auch als nicht PHP’ler, können Sie sich bei einigen PHP-Fehlern auch selbst helfen!

Gruß
Bernd Klüppelberg

Bisher gibt es keinen Kommentar. Schreiben Sie einen Kommentar!

Schreibe einen Kommentar