Problem mit header...

  • Hallo zusammen,

    ich habe ein Problem mit header(). Ich habe ein Skript, welches nicht ganz auf meinem Mist gewachsen ist ;-). Unter anderem werden in diesem einige Daten gesammelt und sollen dann in einer Datei zum Download angeboten.

    Das Problem ist nun, das das mit dem Download nicht wirklich klappt. Die folgenden Zeilen rufen Warnungen hervor:
    (Cannot modify header information - headers already sent by ....)

    Code
    header("Pragma:public");
    header("Expires:0");
    header("Cache-Control:must-revalidate, post-check=0, pre-check=0"); 
    header("Content-Type:$content_type");
    header("Content-Disposition:attachment; filename=\"$export_name\"");
    header("Content-Description:File Transfer");
    header("Content-Length:".filesize($tmpfname) );  
    header("Accept-Ranges:bytes");

    Weiter geht es dann mit:

    Code
    readfile($tmpfname);             
    exit();

    Es wird keine Datei zum Download angeboten, sondern der Inhalt wird im Browser direkt angezeigt.

    Das mit dem ... headers already sent by...... liegt wohl daran, dass in der die Datei, in der die Daten gesammelt werden und die Datei zum download angeboten werden soll, in eine index.php included wird. In dieser wird schon ein Header gesendet. Also index.php (header gesendet)->inlcude export.php (...soll nochmal header gesendet werden...).

    Hat jemand eine idee, wie man das anders lösen könnte?

    Ich hatte eventuel daran gedacht, den Code oben in eine neue Datei zu schreiben, diese dann aus der export.php heraus aufzurufen und die benötigten Variablen an die neue Datei zu übergeben...($content_type, $tmpfname, $export_name)

    Kann man das eventuell so machen oder gibt es bessere Lösungen?

    Vielleicht noch der Hinweis....dass der Header schon in der index.php gesendet wird, liegt wohl daran, dass ich am Anfang der datei ein Codeschnipsel eingefügt habe, der zu meinem Counter gehört und dadurch der Seitenaufruf eben gezählt wird....Das kann ich nicht ändern, könnte nur den Counter ganz rausnehmen, aber dann wird die Seite nicht mehr gezählt.

    Wenn ich den Counter rausnehme, funktioniert das ganze einwandfrei....
    Also wird der Header schon durch den in die index.php eingebundenen Counter gesendet. Ursache gefunden, aber leider noch keine Lösung...
    Grüße

  • Hallo,

    möglich das du vor dem header() schon ein echo oder sowas hast?
    Wenn ja musst du das wegmachen dann geht es.

    echo ist nur eins davon, es gibt noch mehrere Funktionen die dieses Problem hervorrufen, kann dir aber nicht alle aufzählen, da ich das Problem nur mit echo gemacht habe.

    Schau mal nach =)

    Mfg
    Red


  • Warum um alles in der Welt werden immer wieder verstummelte Fehlermeldungen gepostet. Das macht definitiv keinen Sinn!!! In der Fehlermeldung stehen noch weitere wichtige Informationen!

  • Evtl. hat man Sachen aus dem Script gelöscht und erinnert sich nicht mehr ganz. ;)
    Hinweis:
    Für einfache Sites, vermeide die Ausgabe vor dem Senden von Headern, ist es ansonsten unvermeidlich, kannst du outputbuffering verwenden:
    http://de.php.net/ob_start
    http://de.php.net/ob_get_contents
    http://de.php.net/ob_end_clean
    http://de.php.net/manual/de/outc…utput-buffering

  • Hallo zusammen,

    ich denke, dass ich den Fehler gefunden habe. Ich habe in das Skript, welches nicht laufen will einen Zähler integriert. Somit wird der Seitenaufruf gezählt. Wenn die Seite aufgerufen wird der Counter quasi ausgeführt. Dieser sendet dann bereits einen Header. Denke, dass ich das nicht verhindern kann. Ich will auch nicht wer weiß was an dem Counter ändern.

    Entweder müsste ich ihn rausnehmen oder mir was anderes überlegen. Das mit ob_start wird denke ich auch nicht funktionieren, da ich das ja quasi in den counter einbauen müsste, um es dann nach dem Header für den Download auszugeben.

  • ob_start ist für solche Dinge ein Krücke, die nur unsaubere Programmierung ausbügeln soll. ;)

    Wenn wir den Quellcode kennen würden, würde uns bestimmt eine Lösung einfallen.

  • Hallo,

    der Code ist super umfangreich, da ich den den Code des Zählers und den Code des Skripts, um welches es geht posten müsste.
    Unsauber ist es ja nicht programmiert. Das Skript alleine läuft ohne Probleme, also ohne das Einfügen des Counters. Sobald ich aber den Counter einfüge, dieser muss direkt am Anfang der Seite eingefügt werden, die gezählt werden soll, gibt es eben den Fehler, dass der Header schon gesendet wurde. Ist ja auch klar, durch den Counter wird ein Header gesendet. Wenn ich dann den Header des Skriptes senden will gibts dann eben die Fehlermeldung.

    Ich habe das ganze nun auf zwei Dateien aufgeteilt. Somit habe ich das Problem umgangen. Vielleicht nicht die elegantestet Lösung.

    Grüße

  • Ein Counter soll doch irgendwo einen Wert erhöhen, warum macht der denn dann eine Ausgabe?!

  • Ein Counter soll doch irgendwo einen Wert erhöhen, warum macht der denn dann eine Ausgabe?!


    Frage ich mich auch.

    Liegt der Counter in einer anderen Datei und wird includet? Und ist diese vielleicht als utf8 gespeichert? utf8-Dokumente senden standardmäßig bom (byte order mark) welches eine Ausgabe schon vor Abarbeitung des Inhaltes erzeugt. Abhilfe schafft hier das Speichern des Dokumentes als utf8 ohne BOM. (Editoren wie z.B. Notepad++ bieten diese Option)

  • He Bandit!
    In seinem Fall ist es bestimmt möglich, das ganze auch ohne ob_start sauber hinzubekommen. Aber wenn z. B. Ausgaben in ein Template geschrieben werden sollen, ist so etwas eben notwendig (statt in den ob kann man es natürlich direkt in Variablen schreiben, Unterschied?) und dann hat man auch gleich mehr Freiheiten mit dem Header. ;)