web-dev-qa-db-fra.com

Créer un fichier CSV pour un utilisateur dans PHP

J'ai des données dans une base de données MySQL. J'envoie à l'utilisateur une URL pour extraire ses données sous forme de fichier CSV.

J'ai l'e-mailing du lien, requête MySQL, etc. couvert.

Comment puis-je, quand ils cliquent sur le lien, créer une fenêtre contextuelle pour télécharger un CVS avec l'enregistrement de MySQL?

J'ai toutes les informations pour obtenir le compte rendu. Je ne vois tout simplement pas comment PHP créer le fichier CSV et le laisser télécharger un fichier portant l'extension .csv.

215
Jason

Essayer:

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 éventuellement coder les champs CSV:

function maybeEncodeCSVField($string) {
    if(strpos($string, ',') !== false || strpos($string, '"') !== false || strpos($string, "\n") !== false) {
        $string = '"' . str_replace('"', '""', $string) . '"';
    }
    return $string;
}
277
Oleg Barshay
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

459
Andrii Nemchenko

Voici une version améliorée de la fonction de php.net que @Andrew a publiée.

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 ensembles de résultats MySQL (i)/PDO.

download_csv_results($results, 'your_name_here.csv');

N'oubliez pas de exit() après avoir appelé cette fonction si vous avez terminé avec la page.

18
Xeoncross

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 lorsque vous manipulez des fichiers contenant plusieurs langues, comme des noms de personnes ou des villes.

16
Stan

Le fil est un peu vieux, je le sais, mais pour référence future et pour noobs comme moi-même:

Tous les autres ici expliquent comment créer le CSV, mais manquent un élément fondamental de la question: comment établir un lien. Afin de créer un lien pour télécharger le fichier CSV, il vous suffit de créer un lien vers le fichier .php, qui répond à son tour en tant que fichier .csv. Les en-têtes PHP le font. Cela permet des choses intéressantes, comme l’ajout de variables à la chaîne de requête et la personnalisation du résultat:

<a href="my_csv_creator.php?user=23&amp;othervariable=true">Get CSV</a>

my_csv_creator.php peut utiliser les variables indiqué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, modifier les colonnes du fichier CSV, personnaliser le nom du fichier, etc., par exemple:

User_John_Doe_10_Dec_11.csv
9
LBJ

Créez votre fichier, puis renvoyez-lui une référence avec l'en-tête approprié pour déclencher l'enregistrement sous - éditez les éléments suivants, si nécessaire. 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
typemismatch

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
Justin

Commencez par créer des données sous forme de chaîne avec une virgule comme séparateur (séparé 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
Behzad Ravanbakhsh

Hé ç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
Kaddy

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
user244641

Vous pouvez simplement écrire vos données dans CSV en utilisant la fonction fputcsv . Voyons l'exemple ci-dessous. Ecrit le tableau de liste dans un 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
Shahbaz

Le moyen le plus simple consiste à utiliser un classe CSV 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
Sergiu

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
Joshua

Déjà très bonne solution est venue. Je viens de mettre le code total de sorte qu'un débutant obtenir une 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 sauvegardé ce code dans csv-download.php

Maintenant, voyez 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/>

Ainsi, lorsque j'ai cliqué sur le lien, il télécharge le fichier sans m'emmener à la page csv-download.php du navigateur.

1
zahid9i

Comment écrire dans un fichier CSV en utilisant le script PHP? En fait, je cherchais aussi ça aussi. C'est un peu une tâche facile avec PHP. fputs (gestionnaire, contenu) - cette fonction fonctionne efficacement pour moi. Tout d’abord, vous devez ouvrir le fichier dans lequel vous devez écrire le 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
user1764198

Pour l'envoyer en tant que 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 fichier CSV lui-même, il vous suffit de parcourir l'ensemble de résultats, de formater la sortie et de l'envoyer, comme vous le feriez avec tout autre contenu.

0
Gavin M. Roy

En voici une que j'ai faite auparavant, en récupérant des données entre certaines dates. J'espère que ça 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 = mysql_real_escape_string($_GET["start"]);
    $end = mysql_real_escape_string($_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
Connor Burton
<?
    // 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
Vish00722

Écrire votre propre code CSV est probablement une perte de temps. Utilisez simplement un logiciel tel que league/csv - il traite toutes les tâches difficiles, la documentation est bonne et très stable/fiable:

http://csv.thephpleague.com/

Vous devrez utiliser compositeur. Si vous ne savez pas ce que composer est _, je vous recommande vivement de jeter un oeil à: https://getcomposer.org/

0
John Hunt