Steffen: Datei Include & Cannot modify header information

Hallo zusammen,

ich bekomme folgende Fehlermeldung und kann sie nicht einordnen:

Cannot modify header information - headers already sent by...

Mir ist klar, was die Fehlermeldung bedeutet, allerdings ist es komisch, dass sie an dieser Stelle kommt, da ich auf meinem alten Server dieses Problem nicht hatte, es muss also was mit dem Server Environment zu tun haben.

Der Header wird offenbar durch eine include Anweisung erzeugt (per include Anweisung hole ich mir meine Datei rein, die die Zugangsdaten zur Datenbank zentral speichert, diese besitzt aber keine Ausgabe sondern nur Variablendefinitionen).

Wie gesagt, auf meinem alten Environment läuft es, nur auf meinem neuen Server nicht, muss also etwas mit den Einstellungen zu tun haben.

Wer weiss Rat?

viele Grüße,
Steffen

zur programmstruktur:

<?php
include(Datei mit den Zugangsdaten zur Datenbank);

// Diverse Datenbankabfragen incl. connect und close

if (korrekt) {session_start();} // das geht schon nicht mehr. obwohl vorher nie eine Ausgabe kam.

?>

  1. Moin!

    Hallo zusammen,

    ich bekomme folgende Fehlermeldung und kann sie nicht einordnen:

    Cannot modify header information - headers already sent by...

    Mir ist klar, was die Fehlermeldung bedeutet, allerdings ist es komisch, dass sie an dieser Stelle kommt, da ich auf meinem alten Server dieses Problem nicht hatte, es muss also was mit dem Server Environment zu tun haben.

    Oder mit irgendeinem dummen Leerzeichen, dass aus Versehen irgendwo an die falsche Stelle gekommen ist.

    Da dir die Fehlermeldung was sagt, sagt sie dir ja auch, an welcher Stelle du gucken mußt, weil sich dort eine verbotene Ausgabe befindet.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Danke an alle für die schnellen Antworten. Problem gelöst. In der Datei mit den MySQL Zugangsdaten standen hinter der Zeile ?> noch 2 Leerzeilen. Simples Problem aber durch Eure Antworten hab ich dann gewusst, auf was ich achten muss.

      Schönes Wochenende zusammen!

      viele Grüße,
      Steffen

      1. Hi Steffen,

        Danke an alle für die schnellen Antworten. Problem gelöst. In der Datei mit den MySQL Zugangsdaten standen hinter der Zeile ?> noch 2 Leerzeilen. Simples Problem aber durch Eure Antworten hab ich dann gewusst, auf was ich achten muss.

        Tipp: Das ?> am Ende eines PHP-Scriptes kannst du problemlos weglassen, es ist optional. Auch wenn in vielen Fällen, wo etwas optional ist, der ausführlichere Weg zu einem besseren Programmierstil führt, so würde ich in diesem Fall doch dazu raten, zumindest in Include-Scripten (Libraries, Klassendefinitionen etc.) das schließende ?> wegzulassen - dann kannst du ein Problem wie oben verhindern, welches nämlich schnell passiert, weil manche Editoren sich so konfigurieren lassen, dass sie am Dateiende immer noch eine Leerzeile anfügen. ;-)

        Viele Grüße,
          ~ Dennis.

  2. Hi,

    Mir ist klar, was die Fehlermeldung bedeutet, allerdings ist es komisch, dass sie an dieser Stelle kommt, da ich auf meinem alten Server dieses Problem nicht hatte, es muss also was mit dem Server Environment zu tun haben.

    Vermutlich war auf dem alten Server output_buffering aktiviert - was die Datenausgabe verzoegert, und damit den Fehler umgeht.
    Es zu aktivieren sollte aber nicht noetig sein -

    Der Header wird offenbar durch eine include Anweisung erzeugt (per include Anweisung hole ich mir meine Datei rein, die die Zugangsdaten zur Datenbank zentral speichert, diese besitzt aber keine Ausgabe sondern nur Variablendefinitionen).

    • ueberpruefe diese include-Datei noch mal. Auch Leerzeichen, Leerzeilen etc. ausserhalb der PHP-Tags stellen eine Ausgabe dar.

    MfG ChrisB

  3. Hallo,

    funktionieren die "Diverse Datenbankabfragen incl. connect und close" richitg?

    Kann es sein das eine Error-Meldung ausgegben wird?

    Gruß Jan

  4. Lieber Steffen,

    <?php
    include(Datei mit den Zugangsdaten zur Datenbank);

    // Diverse Datenbankabfragen incl. connect und close

    if (korrekt) {session_start();} // das geht schon nicht mehr. obwohl vorher nie eine Ausgabe kam.

    da kann bereits ein Leerzeichen oder eine Leerzeile am Anfang in der PHP-Datei eine "Ausgabe" erzeugen. In dem Moment, wo irgendetwas per echo, print oder auch nur ?>HTML-Code<?php in der PHP-Datei an den Browser geschickt werden soll, ist eine Ausgabe getätigt worden.

    Du kannst aus dem Fehlen dieser Fehlermeldung auf dem "alten Server" nicht schließen, dass Dein Script nicht auch diese Fehlermeldung erzeugt hat, denn es kann durchaus sein, dass dort das Ausgeben der Fehlermeldungen entsprechend anders konfiguriert war.

    Mein Tipp: Benutze ob_start(), um das output buffering zu aktivieren, sodass alle Ausgaben an den Browser in einem Puffer aufgefangen werden. Erst wenn Du in Deinem Script explizit diesen Puffer leeren (sprich: an den Browser ausgeben) lässt, gelangen wirklich die ersten Daten zum Browser. Vorher können alle Header noch fleißig umgeändert und korrigiert werden.

    In meinem GB-Script mache ich das auch so. Vielleicht willst Du es Dir anschauen...

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Moin!

      Mein Tipp: Benutze ob_start(), um das output buffering zu aktivieren, sodass alle Ausgaben an den Browser in einem Puffer aufgefangen werden.

      Ich halte diese Pufferung nicht wirklich für hilfreich.

      Erstens erlaubt es einen schludrigen Programmierstil, denn wer es nötig hat, erst nach Beginn der HTML-Ausgabe über eventuelle HTTP-Header nachzudenken, der hat keine sinnvolle Struktur in seinem Skript.

      Zweitens hilft das Puffern nicht, wenn schon in der allerersten PHP-Datei noch vor Beginn des allerersten PHP-Bereichs ein unsichtbares Zeichen ausgegeben wird. Man bekämpft damit nicht die wirkliche Ursache.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."