CSV Datei zum download anbieten

DiDiJo

Erfahrenes Mitglied
hey leute,

ich will mir ne DB-Backup-Funktion auf meine Homepagemachen. Der Plan ist, dass ich auf einen Link klicke und mir eine Funktion eine generierte CSV Datei zum Download anbietet.

Den Inhalt für die Datei habe ich mir schon zusammengestellt. Ich kriege allerdings keine Datei auf meinem Server erzeugt, obwohl der Ordner die entsprechenden Rechte hat.

Aber was mich noch viel mehr interessiert ist folgendes. Wenn ich dann mal die Datei erzeugt habe, wie biete ich die zum Download an. ich will nur einmal klicken müssen.

Quasi so: Link wird angeklickt -> eine Funmktion generiert im Hintergrund die CSV Datei -> ich kriege einen Download / Datei-Speichern-Unter Fenster

muss ich da irgendwas mit dem Header machen ? wenn ja was ?
 
Den Download anbieten statt sie anzuzeigen machst du über den header() befehl

PHP:
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="downloaded.csv"');

Dannach schreibst du die CSV per echo darunter. Durch das Content-Disposition weis der Browser das er das ganze runterladen soll.

Falls du die Datei anderweitig generierst kannst du auch mir readfile() unter den Header befehlen arbeiten um die Datei auzzugeben.
 
Zuletzt bearbeitet:
sehe ich das richtig, dass der "header"-Befehl vor jeder ausgabe kommt. Und wie meinst du das mit "echo die Datei darunter schreiben"

so

PHP:
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="downloaded.csv"');

$rs = mysql_query("SELECT * FROM $table")
$anz = mysql_num_fields($rs);
while ($row = mysql_fetch_array($rs)) {
	for($i=0;$i<$anz;$i++) {
		echo $row[$i].';';
	}
}

das is im Moment der Quellcode meiner "getCSV($table)" funktion. Die Seite sieht in etwa so aus

PHP:
<?php
session_start();
include 'inc/header.php';

if ($_REQUEST['db']) {
	switch($_REQUEST['db']) {
		case 1: getCSV('marktforschung');				
				//insertProtokoll($_SESSION['uid'],'fordert Protokoll (Marktforschung) an',$_SESSION['uid']);
				break;
		case 2: getCSV('user');
				//insertProtokoll($_SESSION['uid'],'fordert Protokoll (Userdaten) an',$_SESSION['uid']);
				break;
		case 3: getCSV('protokoll');
				//insertProtokoll($_SESSION['uid'],'fordert Protokoll (Protokoll) an',$_SESSION['uid']);
				break;	
	}
}
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>hkvhjk</title>
</head>
<body>

<a href="backup.php?db=1">Backup Datenbank => Marktforschung</a><br/><br/>
<a href="backup.php?db=2">Backup Datenbank => Userdaten</a><br/><br/>
<a href="backup.php?db=3">Backup Datenbank => Protokoll</a><br/><br/>



also wenn ich das so mache, dann hab ich 2 Probleme.

1. mein kompletter Quellcode der seite steckt in der CSV datei
2. ich hab noch keine zeilenumbrüche
 
Zuletzt bearbeitet:
sehe ich das richtig, dass der "header"-Befehl vor jeder ausgabe kommt
Ja, Header kommen immer vor jeder ausgabe an den Browser.

Leicht abgeänderte Version:
PHP:
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="downloaded.csv"');

$rs = mysql_query("SELECT * FROM $table")
while ($row = mysql_fetch_array($rs)) {
    echo implode(";", $row)."\n";
} 
exit;

1) Durch exit bzw die kannst du den restlichen scriptablauf unterbinden.
2) Nach deinem Format könntest du auch unter deine for schleife echo "\n"; packen oder es eben so übernehmen.
 
Zuletzt bearbeitet:
Zurück