3.6k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo Forum,

ich möchte aus einer MySQL-Datenbank ausgelesene Daten in einer CSV-Datei speichern. Nachfolgend ein Auszug aus dem Code:


header('Content-Type: text/x-csv');
header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Content-Disposition: attachment; filename=download.csv');
header('Pragma: no-cache');

$DatabasePointer = mysql_connect($DatabaseHost, $DatabaseUser, $DatabasePassword);
mysql_select_db($Database, $DatabasePointer);

$ResultPointer = mysql_query("SELECT timestamp, name, email FROM $Table");

for($i = 0, $Export = ""; $i < mysql_num_rows($ResultPointer); $i++)
{
$Daten = mysql_fetch_object($ResultPointer);

$Spalte[] = str_replace("\"", "\"\"", $Daten->timestamp);
$Spalte[] = str_replace("\"", "\"\"", $Daten->name);
$Spalte[] = str_replace("\"", "\"\"", $Daten->email);

for($j = 0; $j < count($Spalte); $j++)
{
$Export .= "\"" . $Spalte[$j] . "\"";

if($j != count($Spalte)-1)
{
$Export .= ";";
}
}
$Export .= "\r\n";
$Spalte = "";
}

echo $Export;


Allerdings bekomme ich bei Aufruf der PHP-Datei die Datensätze nur angezeigt, der Download-Dialog startet nicht.

Hat jemand eine Idee?

Viiiiiieeeeeeeeeelen Dank im Voraus!
Tamara

7 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Ersetz
header('Content-Type: text/x-csv');

einfach durch
header("Content-type: application/octet-stream");


Im Gegensatz zu einem losen Oktettfluss weiß der Browser "text" ja zu interpretieren (auch HTML ist ja Text). Noch einen Hinweis: sollte deine Seite über HTTPS laufen, dann wird es Nutzern des MSIE 6 nicht möglich sein, Deine Datei runterzuladen.
0 Punkte
Beantwortet von
Hallo son_quatsch,

danke für den Tip, hab´s probiert, leider mit dem gleichen Ergebnis ...

Hast Du evtl. noch einen Rat?
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Folgender Code sollte auch über HTTPS funktionieren:

header("Content-Type: text/csv; charset=ISO-8859-1");
header("Content-Disposition: attachment; filename=\"download.dsv\"");
header("Expires: ".gmdate(DATE_RFC1123));
if ( ($_SERVER['HTTPS']) && (strpos($_SERVER['HTTP_USER_AGENT'],'MSIE') !== false) )
{
// for IE, see http://support.microsoft.com/kb/812935
header("Cache-Control: ");
header("Pragma: ");
}
else
{
header("Pragma: no-cache");
header("Cache-Control: no-cache, no-store, must-revalidate, post-check=0, pre-check=0");
}
0 Punkte
Beantwortet von
Hallo Supermax,

das funktioniert leider auch nicht -> kann ich was falsch machen? Richtig Strg+C und Strg+V zu bedienen, traue ich mir zu ;-)

Es wird nach wie vor so ausgegeben:
"2010-01-20 11:02:29";"test1";"test1" "2010-01-20 13:36:04";"test4";"test4" "2010-01-20 13:21:07";"test3";"test3" "2010-01-20 12:15:37";"test2";"test2"

Hast Du noch eine Idee, woran es scheitern könnte?

Vielen Dank im Voraus!
Tamy
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Nunja - du könntest deinen Browser bereits so eingestellt haben, dass er Dateien mit CSV-Endung anzeigen statt runterladen soll.

Bei mir beispielsweise wird in zwei Browsern (Opera und Firefox) mit deinem erstgenannten Code immer ein Download-Dialog angezeigt.
0 Punkte
Beantwortet von
Hallo son_quatsch,

im Browser ist für .csv nichts eingestellt. Ich habe jetzt folgenden Test gemacht: ich habe eine Datei "test.csv" generiert, die hochgeladen und auf meiner Testseite verlinkt. Wenn ich den Link, hinter dem die .csv-Datei liegt, anklicke, kommt der Dialog zum Öffnen bzw. Speichern "ganz normal". Scheinbar werden meine Daten aus der MySQL-DB überhaupt gar nicht in eine Datei reingesteckt ???!!!???

Hast Du evtl. noch eine Idee?
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Scheinbar werden meine Daten aus der MySQL-DB überhaupt gar nicht in eine Datei reingesteckt
Das ist völlig irrelevant - die Kommunikation zwischen Server und Client (Browser) ist HTTP - das sind nie Dateien und immer Datenflüsse.

Aber man kann Antworten jedes Servers analysieren, z.B. mit LiveHTTPHeaders als Plugin für den Firefox. Dort guckst du dir einmal die Antwort von deinem Server an (mit deinem Skript) und einmal das von dem, wo du die CSV-Datei hochgeladen hast. Alternativ beide (Download)-URLs mal hier posten, dann guck ich nach.
...