- Ad -
php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here!

Thema geschlossen
 
LinkBack (6) Themen-Optionen Thema bewerten
  6 links from elsewhere to this Post. Click to view. #1 (permalink)  
Alt 05-12-2005, 14:04
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.698
Kropff befindet sich auf einem aufstrebenden Ast
Standard Warning: Cannot modify header information

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
PHP-Code:
<meta http-equiv="refresh" content="0; URL=http://www.example.com"
in etwa dem PHP-Befehl
PHP-Code:
header ("Location: http://www.example.com"); 
oder
PHP-Code:
<meta http-equiv="pragma" content="no-cache"
dem
PHP-Code:
header ("Pragma: no-cache"); 
Es gibt aber einen kleinen und sehr feinen Unterschied. In reinem HTML-Code werden die <meta…>-Anweisungen im Head-Bereich definiert, also zum Beispiel:
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
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.
PHP-Code:
/*Hier müsst ihr euch jetzt ein Leerzeichen vorstellen*/<?
   header 
("Location: http://www.example.com");
?>
Ein Zeilenumbruch hat natürlich dieselbe Wirkung:
PHP-Code:
/*Zeile 1:*/
/*Zeile 2:*/ <?
/*Zeile 3:*/     header ();
/*Zeile 4:*/ ?>
So etwas wie:
PHP-Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<?
   header 
("Location: http://www.example.com");
?>
<title></title>
</head>
    …
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“:
PHP-Code:
<?
include ('css.php');
if (
$bla == 1header ("Location: http://www.example.com");
?>
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:
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">;
}
?>
Wenn jetzt $bla aus welchen Grund auch immer den Wert 1 hat, so wird folgende Fehlermeldung beim Aufruf der test.php(!) erzeugt:
Zitat:
Warning: Cannot modify header information - headers already sent by (output started at /www/css.php:4) in /www/test.php on line x
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:
PHP-Code:
<br />
<
b>Warning</b>:  Cannot modify header information … in <b></bon line <b></b><br /> 
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.
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite

Geändert von Kropff (05-12-2005 um 14:09 Uhr)
  #2 (permalink)  
Alt 05-12-2005, 23:05
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.099
Quetschi wird schon bald berühmt werden
Standard

hmm, ich habs mir jetzt auch mal durchgelesen. Evtl. könnte man auch noch erklären was HTTP-Header sind und das sie nichts mit dem Head-Bereich im Html zu tun haben, auch wenn es hier diverse Metas gibt, die ähnliche Auswirkungen haben wie gewisse HTTP-Header.

Wenn jemand eine (PHP)-Seite von einer Domain aufruft, schickt der Webserver vor dem eigentlichen Quelltext erst noch ein paar Infos ab - sowas kann so aussehen:

Code:
HTTP/1.0 200 OK
Date: Mon, 05 Dec 2005 21:41:20 GMT
Server: Apache/2.0.50 (Unix) mod_perl/1.99_14 Perl/v5.6.1 PHP/5.0.2
X-Powered-By: PHP/5.0.2
Cache-Control: max-age=0
Expires: Mon, 05 Dec 2005 21:41:20 GMT
Content-Length: 4973
Connection: close
Content-Type: text/html

<html>
 <head>
  <title>Super Homepage</title>
  <meta .... />
  <meta .... />
 </head>
 <body>
   Wahnsinns-Content
 </body>
</html>
Alles was hier vor '<html>.....' steht sind die sogenannten HTTP-Header, also das, was ihr mit dem PHP-Befehl header(); beeinflussen könnt.

Diese HTTP-Header sendet ein Webserver immer im voraus mit wenn er damit beginnt eine Seite an ihren Bestimmungsort zu schicken. Er sendet diese HTTP-Header ab, sobald auch nur ein einziges (Leer)zeichen an den Browser gesendet werden soll - ist dies geschehen, gibt es kein zurück mehr.

Gebt ihr also auch nur ein einziges Zeichen aus (ich nehm ihm nachfolgenden Beispiel mal ein x anstelle eines Leerzeichens zur besseren sichtbarkeit) und verwendet dann später im Script z.B. einen header("Location: http://www.xyz.de/") -Befehl - würde eigentlich folgendes passieren:

Code:
HTTP/1.0 200 OK
Date: Mon, 05 Dec 2005 21:41:20 GMT
Server: Apache/2.0.50 (Unix) mod_perl/1.99_14 Perl/v5.6.1 PHP/5.0.2
X-Powered-By: PHP/5.0.2
Cache-Control: max-age=0
Expires: Mon, 05 Dec 2005 21:41:20 GMT
Content-Length: 4973
Connection: close
Content-Type: text/html

xLocation: http://www.xyz.de/
Das wäre natürlich Blödsinn, denn der Browser würde das dann nicht mehr als HTTP-Header interpretieren, sondern als ganz normalen Quelltext (der beginnt immer nach dem ersten doppelten Zeilenumbruch nach der letzten Headerzeile) - PHP weiß nun aber dass die Header bereits abgesendet wurden und anstelle nun irgendwelchen Unsinn an den Browser zu senden, produziert PHP eine Fehlermeldung, die auf diesen Mißstand aufmerksam macht -> das vielzitierte:

Code:
Warning: Cannot modify header information - headers already sent 
by (output started at /bli/bla/blub.php:80)

Geändert von Quetschi (05-12-2005 um 23:08 Uhr)
Thema geschlossen

Lesezeichen


LinkBacks (?)
LinkBack to this Thread: http://www.php-resource.de/forum/php-developer-forum/62965-warning-cannot-modify-header-information.html
Erstellt von For Type Datum
Email wird nicht verschickt - Coding - breadfish.de - DIE deutschsprachige GTA-Community This thread Refback 05-04-2015 17:33
Arne seine Homepage | Downloads | PHP This thread Refback 16-02-2015 20:47
Problem bei Code snippet "Wasserzeichen" erstellen - PHP Forum This thread Refback 28-01-2013 15:34
Problem bei Code snippet "Wasserzeichen" erstellen - PHP Forum This thread Refback 27-01-2013 10:37
[Tool] DS OBST Relaunch - Seite 5 This thread Refback 29-11-2012 12:47
[Tool] DS OBST Relaunch - Seite 5 This thread Refback 31-10-2012 16:13

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

Zeit ist Geld, PC einfach selbst reparieren!
Zeit ist Geld, PC einfach selbst reparieren!Wenn der PC nicht richtig läuft, wirft sie das in Ihrem Arbeitsalltag meist zurück. Dabei können Sie einige Probleme mit relativ wenig Aufwand und ohne intime Kenntnisse Ihres Rechners selbst lösene

18.04.2016 | Berni

Die wichtigsten Rahmenbedingungen für das Hosting
Die wichtigsten Rahmenbedingungen für das HostingGuter Webspace wird in der heutigen Zeit immer wichtiger. Die Scripte werden moderner und fordern höhere Leistung, der allgemeine Traffic im Internet nimmt zu.

17.08.2015 | Berni


 

Aktuelle PHP Scripte

uAutoDealers

uAutoDealers is one of the best one-size-fits-all solutions for any car dealer who are looking to bring their business online. This script is the fully functional PHP solution that allows to create infinite pages for listings, easily modify data fields, a

25.05.2016 apphpcom | Kategorie: PHP/ Anzeigenmarkt
eZ publish 5

eZ publish 3 ist ein geöffneter Quellinhalt Managementsystem- und -entwicklungsrahmen. Mit vorgerückter Funktionalität für zufriedenes Management (CMS), Ehandel, intranets und viel mehr, können Sie Ihre dynamischen Internet-Lösungen schnell errichten und

20.05.2016 tg@ | Kategorie: PHP/ CMS
Shopkatalog Portal inkl. Spidertool für OS Commerce und XT Commerce

Shopkatalog Portal inkl. Spidertool für OS Commerce und XT Commerce

17.05.2016 PHP-Script-Shop | Kategorie: PHP/ Shops
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 07:46 Uhr.