Warning: Cannot modify header information - headers already sent by (output started at /www/test.php:1) in /www/test.php on line 2
Wie oft schon wurden (und werden noch immer) Fragen gestellt wie „Was bedeutet denn diese Fehlermeldung?“ oder „Wieso funktioniert mein Code nicht? Ich gebe doch vorher nichts aus.“
Um nun ein für alle mal Licht in das Dunkel zu bringen, habe ich dieses kleine Manual verfasst.
Grundsätzliches:
Der header-Befehl sendet spezielle HTTP-Informationen und ist in etwa vergleichbar mit dem HTML-Tag <meta http-equiv…>
So entspricht
in etwa dem PHP-Befehl
oder
dem
Es gibt aber einen kleinen und sehr feinen Unterschied. In reinem HTML-Code werden die <meta…>-Anweisungen im Head-Bereich definiert, also zum Beispiel:
Wenn man aber in PHP den header-Befehl benutzt, so darf vorher keine Ausgabe erzeugt werden. Das heißt einfach ausgedrückt, es darf nichts, aber auch wirklich gar nichts produziert werden, dass ein Browser darstellen kann. Dazu gehören HTML-Tags, stinknormale ASCII-Zeichen, Leerzeichen, Zeilenumbrüche oder PHP-Ausgaben z.B. mit echo oder print.
Um zum Beispiel die oben aufgeführte Fehlermeldung zu bekommen, reicht schon ein einfaches Leerzeichen vor dem beginnenden PHP-Code aus.
Ein Zeilenumbruch hat natürlich dieselbe Wirkung:
So etwas wie:
ist da natürlich völliger Tinnef , da wir bereits in den ersten drei(!) Zeilen Daten ausgeben.
Sehr beliebt ist auch der Fehler, Ausgaben in include-Dateien zu erzeugen und erst nachher den header-Befehl zu setzen. Ein kleines (zugegebenermaßen dummes) Beispiel soll das erklären. Wir haben eine Datei namens „test.php“:
In der css.php fragen wir nun den Browser ab, ist es der allseits beliebte Internet Explorer, so wird eine spezielle CSS-Datei eingebunden, anderenfalls eine Standard-Datei:
Wenn jetzt $bla aus welchen Grund auch immer den Wert 1 hat, so wird folgende Fehlermeldung beim Aufruf der test.php(!) erzeugt:
Anfänger machen dann sehr oft den Fehler, nicht in der eingebunden Datei (in diesem Fall css.php) sondern in der Hauptdatei (test.php) nach fehlerhaftem Code zu suchen, weil sie die Meldung nicht genau genug lesen. Die ist aber sehr detailliert:
output started at /www/css.php:4
Übersetzt heißt das, dass in der css.php in Zeile 4 eine Ausgabe erzeugt wurde. Also muss man auch dort suchen.
Debugging:
Ist in diesem Fall sehr einfach. Ihr bekommt im Browser eine Fehlermeldung à la „Cannot modify header….“, dann macht ihr einfach einen rechten Mausklick und wählt „Quelltext anzeigen“.
Die eigentliche Fehlermeldung selber sieht dann so aus:
Und alles was vor dem ersten <br /> steht, ist eine Ausgabe, die IHR erzeugt habt. Da gibt es kein wenn und kein aber. Also lehnt euch zurück, raucht eine Zigarette (oder was anderes) und überlegt euch in aller Ruhe, wo das wohl herkommen mag. Dann ist es auch nicht schwierig, den Fehler zu finden.
Ach übrigens, das selbe gilt auch bei der Verwendung von Sessions, zum Beispiel ein dummes Leerzeichen an der falschen Stelle und ihr habt das selbe Problem.
Wie oft schon wurden (und werden noch immer) Fragen gestellt wie „Was bedeutet denn diese Fehlermeldung?“ oder „Wieso funktioniert mein Code nicht? Ich gebe doch vorher nichts aus.“
Um nun ein für alle mal Licht in das Dunkel zu bringen, habe ich dieses kleine Manual verfasst.
Grundsätzliches:
Der header-Befehl sendet spezielle HTTP-Informationen und ist in etwa vergleichbar mit dem HTML-Tag <meta http-equiv…>
So entspricht
PHP-Code:
<meta http-equiv="refresh" content="0; URL=http://www.example.com">
PHP-Code:
header ("Location: http://www.example.com");
PHP-Code:
<meta http-equiv="pragma" content="no-cache">
PHP-Code:
header ("Pragma: no-cache");
PHP-Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Blubb</title>
<meta http-equiv="refresh" content="0; URL=http://www.example.com">
</head>
<body>
…
</body>
</html>
Um zum Beispiel die oben aufgeführte Fehlermeldung zu bekommen, reicht schon ein einfaches Leerzeichen vor dem beginnenden PHP-Code aus.
PHP-Code:
/*Hier müsst ihr euch jetzt ein Leerzeichen vorstellen*/<?
header ("Location: http://www.example.com");
?>
PHP-Code:
/*Zeile 1:*/
/*Zeile 2:*/ <?
/*Zeile 3:*/ header (…);
/*Zeile 4:*/ ?>
PHP-Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<?
header ("Location: http://www.example.com");
?>
<title></title>
</head>
…
Sehr beliebt ist auch der Fehler, Ausgaben in include-Dateien zu erzeugen und erst nachher den header-Befehl zu setzen. Ein kleines (zugegebenermaßen dummes) Beispiel soll das erklären. Wir haben eine Datei namens „test.php“:
PHP-Code:
<?
include ('css.php');
if ($bla == 1) header ("Location: http://www.example.com");
?>
PHP-Code:
<?
if(ereg("MSIE", $_SERVER['HTTP_USER_AGENT']))
{
echo ‘<link rel="stylesheet" href="ie.css" type="text/css">’;
}
else
{
echo ‘<link rel="stylesheet" href="andere.css" type="text/css">’;
}
?>
Warning: Cannot modify header information - headers already sent by (output started at /www/css.php:4) in /www/test.php on line x
output started at /www/css.php:4
Übersetzt heißt das, dass in der css.php in Zeile 4 eine Ausgabe erzeugt wurde. Also muss man auch dort suchen.
Debugging:
Ist in diesem Fall sehr einfach. Ihr bekommt im Browser eine Fehlermeldung à la „Cannot modify header….“, dann macht ihr einfach einen rechten Mausklick und wählt „Quelltext anzeigen“.
Die eigentliche Fehlermeldung selber sieht dann so aus:
PHP-Code:
<br />
<b>Warning</b>: Cannot modify header information … in <b>…</b> on line <b>…</b><br />
Ach übrigens, das selbe gilt auch bei der Verwendung von Sessions, zum Beispiel ein dummes Leerzeichen an der falschen Stelle und ihr habt das selbe Problem.
Kommentar