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.

204
demandé sur d-_-b 2008-10-20 07:11:46

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;
}
269
répondu Oleg Barshay 2017-09-04 12:58:13
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")
));

Php: / / sortie
fputcsv

448
répondu Andrii Nemchenko 2018-09-05 13:56:28

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.

18
répondu Xeoncross 2018-09-05 13:56:41

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.

16
répondu Stan 2015-02-18 15:09:54

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&amp;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
9
répondu LBJ 2011-12-10 09:07:05

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);
7
répondu typemismatch 2018-09-05 13:56:49

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);
}
5
répondu Justin 2018-09-05 13:57:00

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);
*/
4
répondu Behzad Ravanbakhsh 2011-08-19 16:50:21

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;
}

?>

3
répondu Kaddy 2013-02-14 13:41:50

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.

2
répondu user244641 2018-09-05 13:57:37

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);
2
répondu Shahbaz 2018-09-05 13:57:44

Le plus simple est d'utiliser une classe CSV dédiée comme ceci:

$csv = new csv();
$csv->load_data(array(
    array('name'=>'John', 'age'=>35),
    array('name'=>'Adrian', 'age'=>23), 
    array('name'=>'William', 'age'=>57) 
));
$csv->send_file('age.csv'); 
1
répondu Sergiu 2011-07-25 18:51:48

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";
}
1
répondu Joshua 2011-08-19 16:53:53

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.

1
répondu zahid9i 2012-12-17 16:19:35

Pour l'envoyer au format CSV et lui donner le nom du fichier, utilisez header ():

Http://us2.php.net/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.

0
répondu Gavin M. Roy 2008-10-20 03:15:08

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;
    }
?>
0
répondu Connor Burton 2011-08-19 16:53:20

É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:

Http://csv.thephpleague.com/

Vous devrez utiliser composer. Si vous ne savez pas quel compositeur est je vous recommande fortement de jeter un oeil: https://getcomposer.org/

0
répondu John Hunt 2017-06-06 08:15:29
<?
    // 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 );
?>
0
répondu 3 revs, 3 users 69%Vish00722 2018-09-05 13:58:02

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);
}
0
répondu ntzm 2018-09-05 13:58:14

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;
-1
répondu Lorenzo Massacci 2012-12-07 01:10:23