2011-01-05 9 views
0

J'ai un peu de mal à exporter un fichier csv créé à partir d'une de mes tables mysql en utilisant php.Export CSV from Mysql

Le code que j'utilise imprime les données correctes, mais je ne vois pas comment télécharger ces données dans un fichier csv, fournissant un lien de téléchargement vers le fichier créé. Je pensais que le navigateur était censé fournir automatiquement le fichier à télécharger, mais ce n'est pas le cas. (Serait-ce parce que le code ci-dessous est appelé en utilisant ajax?)

Toute aide grandement appréciée - le code ci-dessous, S.

include('../cofig/config.php'); //db connection settings 
$query = "SELECT * FROM isregistered"; 
$export = mysql_query($query) or die("Sql error : " . mysql_error()); 
$fields = mysql_num_fields($export); 
for ($i = 0; $i < $fields; $i++) { 
    $header .= mysql_field_name($export, $i) . "\t"; 
} 
while ($row = mysql_fetch_row($export)) { 
    $line = ''; 
    foreach ($row as $value) { 
     if ((!isset($value)) || ($value == "")) { 
      $value = "\t"; 
     } else { 
      $value = str_replace('"', '""', $value); 
      $value = '"' . $value . '"' . "\t"; 
     } 
     $line .= $value; 
    } 
    $data .= trim($line) . "\n"; 
} 
$data = str_replace("\r", "", $data); 

if ($data == "") { 
    $data = "\n(0) Records Found!\n"; 
} 
//header("Content-type: application/octet-stream"); //have tried all of these at sometime 
//header("Content-type: text/x-csv"); 
header("Content-type: text/csv"); 
//header("Content-type: application/csv"); 
header("Content-Disposition: attachment; filename=export.csv"); 
//header("Content-Disposition: attachment; filename=export.xls"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

echo '<a href="">Download Exported Data</a>'; //want my link to go in here... 

print "$header\n$data"; 

Répondre

0

Vous ne pouvez pas avoir un texte et un téléchargement sur la même page. Vous devez avoir un lien vers la zone de téléchargement, qui pourrait simplement être un paramètre GET menant à une fonction, qui effectue ensuite tout le traitement, affiche les en-têtes et fait écho au contenu du fichier CSV.

Par exemple, vous pouvez avoir <a href="foo.php?action=download">Click here to download CSV</a>, puis dans votre code avez if ($_GET['action'] === 'download'), obtenir les données de la base de données, le formater, envoyer les en-têtes et renvoyer les données. Et puis die(), parce que cette partie du script ne peut plus accomplir.

+0

Un grand merci pour l'aide de tout le monde - très apprécié. – ss888

0

Vous ne devriez pas mettre le lien dans le même fichier qui génère le csv, comme le lien ne sera pas dans le csv lui-même!

faire quelque chose comme:

<a href="fileThatGeneratesTheCSV.php">Download CSV</a> 

et il devrait fonctionner

+0

Et puis utiliser le type de contenu correct: application/vnd.ms-excel avec Fichiers .xls. –

+0

@Andrew Sledge: Pourquoi utiliseriez-vous un tel type de contenu? Que se passe-t-il si Office Office n'est pas installé? 'text/csv' est ce qu'il devrait utiliser. – nico

+0

Je pense que Andrew Sledge disait, pour la ligne commentée sur les fichiers xls, utilisez le bon type. – Andrew

1

En substance, vous ne pouvez pas sortir le fichier CSV et le lien en une fois. (Vous devez introduire le concept d'une page "mode" et activer le mode de téléchargement via ... pagename.php? Mode = download ou similaire Vous pouvez alors utiliser l'instruction switch de PHP pour activer $ _GET ['mode'] Cela dit, l'en-tête de type de contenu text/csv que vous utilisiez est correct, bien que vous souhaitiez également afficher les en-têtes Content-Length et Content-Disposition. Après avoir sorti les données du fichier, veillez également à arrêter tout traitement de script supplémentaire via la fonction exit de PHP.

En outre, il serait probablement beaucoup moins de tracas (et sera certainement plus rapide/plus de mémoire efficace) pour utiliser MySQL SELECT ... INTO OUTFILE installation (si vous avez les autorisations) plutôt que d'utiliser PHP pour recueillir les données.

0

Trois choses à considérer:

  1. Vous envoyez les en-têtes indiquant que l'utilisateur va être le téléchargement d'un fichier CSV, mais vous envoyez créer un lien pour le télécharger? Ce n'est pas correct, vous devriez être un lien vers cette page, puis seulement sortir les données CSV lui-même après les en-têtes. MySQL a la capacité de générer des sorties CSV, et vous devriez certainement en profiter au lieu d'essayer de le faire vous-même. Vous pouvez utiliser SELECT INTO ... OUTFILE pour ce faire.

  2. Si vous devez créer le fichier CSV à l'aide de PHP, veuillez utiliser fputcsv pour ce faire. Cela permettra de gérer toutes les complications de CSV telles que l'échappement et le formatage approprié.Depuis fputcsv écrit dans un fichier, vous pouvez soit écrire dans un fichier temporaire, puis la sortie après que vous envoyer vos en-têtes, ou utiliser l'astuce suivante pour sortie directement:

Faites ceci après que les en-têtes d'envoi:

$fp = fopen('php://output', 'w'); 
while($row = mysql_fetch_row($export)) { 
    fputcsv($fp, $row); 
} 
0

Je pense que le mySQL => CSV est un problème courant qui fait partie de chaque forum PHP. J'ai essayé de résoudre ce problème d'une manière courante et d'implémenter une librairie d'exportation libre lib pour PHP qui est très similaire à la philosophie Google AppInventor. Faites glisser et masquez les éléments de codage.

Utilisez la lib et créez votre exportation via le point &.

Démonstrations communes: http://www.freegroup.de/software/phpBlocks/demo.html Lien vers l'éditeur: http://www.freegroup.de/test/editor/editor.php?xml=demo_sql.xml

en valeur un regard

Salutations

Andreas