Créer un fichier CSV pour un utilisateur en PHP
J'ai des données dans une base de données MySQL. J'envoie à l'utilisateur une URL pour obtenir leurs données en tant que fichier CSV.
J'ai l'e-mailing du lien, de la requête MySQL, etc. couvert.
Comment puis-je, quand ils cliquent sur le lien, avoir un pop-up pour télécharger un CVS avec L'enregistrement de MySQL?
J'ai toutes les informations pour obtenir l'enregistrement déjà. Je ne vois tout simplement pas comment faire en sorte que PHP crée le fichier CSV et les laisse télécharger un fichier avec un .extension csv.
20 réponses
Essayez:
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo "record1,record2,record3\n";
die;
Etc
Edit: voici un extrait de code que j'utilise pour coder éventuellement des champs CSV:
function maybeEncodeCSVField($string) {
if(strpos($string, ',') !== false || strpos($string, '"') !== false || strpos($string, "\n") !== false) {
$string = '"' . str_replace('"', '""', $string) . '"';
}
return $string;
}
header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
function outputCSV($data) {
$output = fopen("php://output", "wb");
foreach ($data as $row)
fputcsv($output, $row); // here you can change delimiter/enclosure
fclose($output);
}
outputCSV(array(
array("name 1", "age 1", "city 1"),
array("name 2", "age 2", "city 2"),
array("name 3", "age 3", "city 3")
));
Voici une version améliorée de la fonction de php.net que @ Andrew posté.
function download_csv_results($results, $name = NULL)
{
if( ! $name)
{
$name = md5(uniqid() . microtime(TRUE) . mt_rand()). '.csv';
}
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename='. $name);
header('Pragma: no-cache');
header("Expires: 0");
$outstream = fopen("php://output", "wb");
foreach($results as $result)
{
fputcsv($outstream, $result);
}
fclose($outstream);
}
Il est vraiment facile à utiliser et fonctionne très bien avec les jeux de résultats MySQL(i)/PDO.
download_csv_results($results, 'your_name_here.csv');
N'oubliez pas de exit()
Après avoir appelé ceci si vous avez terminé avec la page.
En plus de tout ce qui a déjà été dit, vous devrez peut-être ajouter:
header("Content-Transfer-Encoding: UTF-8");
C'est très utile lors de la gestion de fichiers contenant plusieurs langues, comme les noms de personnes ou les villes.
Le fil est un peu vieux, je sais, mais pour référence future et pour noobs comme moi-même:
Tout le monde ici explique comment créer le CSV, mais manque une partie de base de la question: comment lier. Afin de créer un lien vers le téléchargement du fichier CSV, il vous suffit de créer un lien vers le .PHP-fichier, qui à son tour répond comme étant un.fichier csv. Les en-têtes PHP le font. Cela permet des choses cool, comme ajouter des variables à la chaîne de requête et personnaliser la sortie:
<a href="my_csv_creator.php?user=23&othervariable=true">Get CSV</a>
My_csv_creator.php peut fonctionner avec les variables données dans la chaîne de requête et par exemple utiliser des requêtes de base de données différentes ou personnalisées, changer les colonnes du CSV, personnaliser le nom de fichier et ainsi de suite, par exemple:
User_John_Doe_10_Dec_11.csv
Créez votre fichier, puis renvoyez-y une référence avec l'en - tête correct pour déclencher L'enregistrement sous-modifiez ce qui suit au besoin. Mettez vos données CSV dans $ csvdata.
$fname = 'myCSV.csv';
$fp = fopen($fname,'wb');
fwrite($fp,$csvdata);
fclose($fp);
header('Content-type: application/csv');
header("Content-Disposition: inline; filename=".$fname);
readfile($fname);
Voici un exemple de travail complet utilisant PDO et incluant les en-têtes de colonne:
$query = $pdo->prepare('SELECT * FROM test WHERE id=?');
$query->execute(array($id));
$results = $query->fetchAll(PDO::FETCH_ASSOC);
download_csv_results($results, 'test.csv');
exit();
function download_csv_results($results, $name)
{
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename='. $name);
header('Pragma: no-cache');
header("Expires: 0");
$outstream = fopen("php://output", "wb");
fputcsv($outstream, array_keys($results[0]));
foreach($results as $result)
{
fputcsv($outstream, $result);
}
fclose($outstream);
}
Faites D'abord les données sous forme de chaîne avec une virgule comme délimiteur (séparée par","). Quelque chose comme ça
$CSV_string="No,Date,Email,Sender Name,Sender Email \n"; //making string, So "\n" is used for newLine
$rand = rand(1,50); //Make a random int number between 1 to 50.
$file ="export/export".$rand.".csv"; //For avoiding cache in the client and on the server
//side it is recommended that the file name be different.
file_put_contents($file,$CSV_string);
/* Or try this code if $CSV_string is an array
fh =fopen($file, 'w');
fputcsv($fh , $CSV_string , "," , "\n" ); // "," is delimiter // "\n" is new line.
fclose($fh);
*/
Hey ça marche très bien....!!!! Merci Peter Mortensen et Connor Burton
<?php
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
ini_set('display_errors',1);
$private=1;
error_reporting(E_ALL ^ E_NOTICE);
mysql_connect("localhost", "user", "pass") or die(mysql_error());
mysql_select_db("db") or die(mysql_error());
$start = $_GET["start"];
$end = $_GET["end"];
$query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00' AND created<='{$end} 23:59:59' ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
$result.="{$row['email']},";
$result.="\n";
echo $result;
}
?>
Méthode Simple -
$data = array (
'aaa,bbb,ccc,dddd',
'123,456,789',
'"aaa","bbb"');
$fp = fopen('data.csv', 'wb');
foreach($data as $line){
$val = explode(",",$line);
fputcsv($fp, $val);
}
fclose($fp);
Ainsi, chaque ligne du tableau $data
ira à une nouvelle ligne de votre fichier CSV nouvellement créé. Cela ne fonctionne que pour PHP 5 et versions ultérieures.
Vous pouvez simplement écrire vos données en CSV en utilisant la fonctionfputcsv . laissez-nous jeter un oeil à l'exemple ci-dessous. Ecrire le tableau de liste dans le fichier CSV
$list[] = array("Cars", "Planes", "Ships");
$list[] = array("Car's2", "Planes2", "Ships2");
//define headers for CSV
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=file_name.csv');
//write data into CSV
$fp = fopen('php://output', 'wb');
//convert data to UTF-8
fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($list as $line) {
fputcsv($fp, $line);
}
fclose($fp);
Au Lieu de:
$query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00' AND created<='{$end} 23:59:59' ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
$result.="{$row['email']},";
$result.="\n";
echo $result;
}
Utilisation:
$query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00' AND created<='{$end} 23:59:59' ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
echo implode(",", $row)."\n";
}
Déjà une très bonne solution est venue. Je suis juste en train de mettre le code total pour qu'un débutant obtienne de l'aide totale
<?php
extract($_GET); //you can send some parameter by query variable. I have sent table name in *table* variable
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=$table.csv");
header("Pragma: no-cache");
header("Expires: 0");
require_once("includes/functions.php"); //necessary mysql connection functions here
//first of all I'll get the column name to put title of csv file.
$query = "SHOW columns FROM $table";
$headers = mysql_query($query) or die(mysql_error());
$csv_head = array();
while ($row = mysql_fetch_array($headers, MYSQL_ASSOC))
{
$csv_head[] = $row['Field'];
}
echo implode(",", $csv_head)."\n";
//now I'll bring the data.
$query = "SELECT * FROM $table";
$select_c = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
foreach ($row as $key => $value) {
//there may be separator (here I have used comma) inside data. So need to put double quote around such data.
if(strpos($value, ',') !== false || strpos($value, '"') !== false || strpos($value, "\n") !== false) {
$row[$key] = '"' . str_replace('"', '""', $value) . '"';
}
}
echo implode(",", $row)."\n";
}
?>
J'ai enregistré ce code dans CSV-download.php
Maintenant voir comment j'ai utilisé ces données pour télécharger le fichier csv
<a href="csv-download.php?table=tbl_vfm"><img title="Download as Excel" src="images/Excel-logo.gif" alt="Download as Excel" /><a/>
Donc, quand j'ai cliqué sur le lien, il télécharge le fichier sans me prendre au téléchargement csv.page php sur le navigateur.
Pour l'envoyer au format CSV et lui donner le nom du fichier, utilisez header ():
header('Content-type: text/csv');
header('Content-disposition: attachment; filename="myfile.csv"');
En ce qui concerne la création du CSV lui-même, vous devez simplement parcourir le jeu de résultats, formater la sortie et l'envoyer, comme vous le feriez pour tout autre contenu.
En voici un que j'ai déjà fait, saisissant des données entre certaines dates. Espérons que cela aide.
<?php
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
ini_set('display_errors',1);
$private=1;
error_reporting(E_ALL ^ E_NOTICE);
mysql_connect("localhost", "user", "pass") or die(mysql_error());
mysql_select_db("db") or die(mysql_error());
$start = $_GET["start"];
$end = $_GET["end"];
$query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00' AND created<='{$end} 23:59:59' ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
$result.="{$row['email']},";
$result.="\n";
echo $result;
}
?>
Écrire votre propre code CSV est probablement une perte de temps, il suffit d'utiliser un paquet tel que league / csv - il traite de toutes les choses difficiles pour vous, la documentation est bonne et c'est très stable / fiable:
Vous devrez utiliser composer. Si vous ne savez pas quel compositeur est je vous recommande fortement de jeter un oeil: https://getcomposer.org/
<?
// Connect to database
$result = mysql_query("select id
from tablename
where shid=3");
list($DBshid) = mysql_fetch_row($result);
/***********************************
Write date to CSV file
***********************************/
$_file = 'show.csv';
$_fp = @fopen( $_file, 'wb' );
$result = mysql_query("select name,compname,job_title,email_add,phone,url from UserTables where id=3");
while (list( $Username, $Useremail_add, $Userphone, $Userurl) = mysql_fetch_row($result))
{
$_csv_data = $Username.','.$Useremail_add.','.$Userphone.','.$Userurl . "\n";
@fwrite( $_fp, $_csv_data);
}
@fclose( $_fp );
?>
Comment écrire dans un fichier CSV en utilisant un script PHP? En fait, je cherchais aussi cela aussi. C'est le genre de tâche facile avec PHP. fputs ( gestionnaire, contenu) - cette fonction fonctionne efficacement pour moi. Vous devez d'abord ouvrir le fichier dans lequel vous devez écrire du contenu en utilisant fopen($CSVFileName, ‘wb’).
$CSVFileName = “test.csv”;
$fp = fopen($CSVFileName, ‘wb’);
//Multiple iterations to append the data using function fputs()
foreach ($csv_post as $temp)
{
$line = “”;
$line .= “Content 1″ . $comma . “$temp” . $comma . “Content 2″ . $comma . “16/10/2012″.$comma;
$line .= “\n”;
fputs($fp, $line);
}
Mettez dans la variable $output
les données CSV et echo avec les en-têtes corrects
header("Content-type: application/download\r\n");
header("Content-disposition: filename=filename.csv\r\n\r\n");
header("Content-Transfer-Encoding: ASCII\r\n");
header("Content-length: ".strlen($output)."\r\n");
echo $output;