Rückgabe vom Server als Datei speichern - mit HTML-Template
francwalter
- php
1 Felix Riesterer0 franc
Hallo,
ich habe ein PHP-Skript, mit dem ich mir vom Server eine DB-Abfrage, die in eine Textdatei gespeichert wird zurückgeben lasse. Und zwar zum Download, mit:
header('Content-type: application/x-octet-stream');
header('Content-disposition: attachment; filename=' . $meine_textdatei);
echo $meine_textdatei_inhalt;
Wenn ich nun am Anfang dieses PHP-Skriptes eine HTML-Vorlage einbinde, um ein formatiertes Formular mit Parametern einzufügen, dann kriege ich die Rückgabe im Browser angezeigt statt zum Download angeboten.
Was mache ich da wohl falsch?
Danke!
franc walter
Lieber francwalter,
header('Content-type: application/x-octet-stream');
header('Content-disposition: attachment; filename=' . $meine_textdatei);echo $meine_textdatei_inhalt;
Wenn ich nun am Anfang dieses PHP-Skriptes eine HTML-Vorlage einbinde
[...]
Was mache ich da wohl falsch?
1.) Du hast beim Testen ERROR_REPORTING nicht auf E_ALL stehen.
2.) Du hast nicht in Dein Fehler-Log geschaut.
3.) Du hast noch nicht realisiert, dass die Funktion header() _vor_ jeglicher Ausgabe von Daten an den Browser aufgerufen werden muss, wenn sie erfolgreich sein soll, denn header() sendet HTTP-Header-Daten, die bekanntermaßen das allererste sein müssen, das zum Browser geschickt wird. Deine "HTML-Vorlage" wird anscheinend als HTML-Code bereits an den Browser ausgegeben worden sein, bevor Dein Script zu der Stelle mit den header()-Aufrufen gelangt...
Lösungsvorschläge:
1.) Jegliche Ausgabe von HTML-Code wird immer schön in eine Variable gespeichert und nicht sofort ausgegeben. Also nix mit überall echo! Nutze dazu die superglobale Variablen $GLOBALS und definiere in ihr (sie ist ein Array) einen Index 'html' oder 'ausgabe', um darin Deinen aktuellen HTML-Code als String abzuspeichern.
Beispiel:
<?php
$GLOBALS['ausgabe'] = '<html>.....<body>';
// "unterwegs"...
$GLOBALS['ausgabe'] .= '<h1>Überschrift</h1>';
// "kurz vor Schluss"...
$GLOBALS['ausgabe'] .= '</body></html>';
// Ende des Scripts
echo $GLOBALS['ausgabe']; // hier endlich doch ein echo
?>
2.) Man kann PHPs output buffer benutzen, um jegliche Ausgabe an den Browser in einen Puffer umzuleiten. Dazu aktiviert man diese Umleitung mit ob_start() und beendet diese am Schluss des eigenen Scripts wieder mit ob_end_flush(), wobei dann aller gepufferter Inhalt an den Browser ausgegeben wird. Unterwegs gibt es noch mehr "ob_"-Funktionen, mit deren Hilfe man das im Puffer Befindliche wieder manipulieren kann.
Beispiel:~~~php
<?php
ob_start();
// komme was wolle
ob_end_flush();
?>
Hier im Forum bin ich schon auf die Meinung gestoßen, dass erstere Methode als "sauberer" empfunden wird, und dass die Notwendigkeit, das output buffering nutzen zu müssen, als Schwäche eines Scripts angesehen wird.
Liebe Grüße aus [Ellwangen](http://www.ellwangen.de/),
Felix Riesterer.
--
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
Lieber Felix,
erstmal herzlichen Dank für die ausführliche Antwort!!!
Ich glaube ich habe verstanden: wenn ich im php-Skript die html-Datei includiere werden ja schon Header gesetzt, neue innerhalb derselben Ausgabe werden dann nicht mehr gesetzt (das wäre ja noch schöner).
Ich muss also entweder vom html-Formular aus direkt das Skript aufrufen (action="mein_php_skript.php") oder den von Dir vorgeschlagenen Weg einschlagen mit ob_start() oder mit $GLOBALS.
Zu:
2.) Das Fehler-Log ist aber doch auf dem Server (da komm ich nicht dran).
Liebe Grüße zurück (aus Leipzig)
franc walter