Der HTML-Header und das Nichts

Eigentlich ist es ganz einfach, in PHP mit HTML-Headern zu arbeiten. Eine Anweisung wie header('location: privatstrand.dirkschmidtke.de'); sorgt zum Beispiel kurz und schmerzlos dafür, dass der Browser die Homepage des Privatstrand-Blogs ansurft. Es sei denn, das Skript weigert sich partout, den Header zu senden, und sondert statt dessen eine Warnung ab, wie gerade bei mir geschehen:

Warning: Cannot modify header information - headers already sent by (output started at /.../../ini.php:16) in /.../.../class.php on line 8

Dann heißt es nur noch: Auf zum fröhlichen Fehlerschießen (engl. troubleshooting)!

Eines ist klar: Die header()-Funktion muss ausgeführt werden, bevor der Browser irgendetwas ausgegeben hat, denn schon für die Ausgabe wird ein Header gesendet. Der Code

echo 'Hallo Welt';
header('location: privatstrand.dirkschmidtke.de');

wird also keine Umleitung auf das Privatstrand-Blog produzieren, sondern eine Warnung im Stil der obigen (wenn Sie keine Warnung sehen, dann liegt das daran, dass PHP so konfiguriert wurde, Warnungen zu unterdrücken).

Ich hatte aber vor dem Header keine Ausgabe ins Skript geschrieben – jedenfalls nicht wissentlich; deshalb musste der Fehler woanders zu suchen sein. Zuerst tippte ich darauf, dass der PHP-Interpreter zuvor über irgendeine Holprigkeit gestolpert war; er hätte deshalb – so mein Kalkül – bereits eine andere warning oder notice ausgeworfen, und schon diese Ausgabe wäre hinreichend gewesen, um meinen Header zu blockieren. Doch dem war nicht so.

Nun heißt es ja nicht umsonst, man soll die Fehlermeldungen genau studieren, bevor man an die Behebung der Ursache geht. Tatsächlich verrät PHP genau, wo die unerwünschte Ausgabe erzeugt wird – in meinem Fall auf Zeile 16 einer inkludierten Datei namens backend.ini.php (output started at /.../../ini.php:16). Ein Blick in die entsprechende Datei ließ mich zuerst ratlos zurück. Tatsächlich wurden dort nur ein einige Konstanten definiert; ausgegeben wurde nichts.

Seltsam nur, dass die Fragezeichen-Spitzmarken-Kombination ?>, mit der das Ende des PHP-Codes markiert wird, sich bereits auf Zeile 14 fand. Die beanstandate Zeile 16 gab es … nicht … eigentlich … also es gab schon eine Zeile 15 und auch die beanstandete Zeile 16, doch dort stand nichts. Nichts? Manche Dinge sind zu erhaben, dass der einfache Mensch sie sofort begreift. Natürlich stand dort nicht nichts. Es befanden sich dort vielmehr ein Zeilenumbruch, der wiederum, da er hinter der schließenden PHP-Spitzmarke stand, als normale Ausgabe an der Browser gesendet wurden.

Innerhalb des PHP-Codes darf man so viele Leerzeilen erzeugen wie man will. Außerhalb nicht. Nachdem ich die beiden herrenlosen Leerzeilen gelöscht hatte, wurde der Header anstandslos gesendet.

Schreibe einen Kommentar