Question

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.

Je traite l'e-mailing du lien, la requête MySQL, etc.

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

Je dispose déjà de toutes les informations pour obtenir le compte rendu. Je ne vois tout simplement pas comment PHP doit créer le fichier CSV et lui permettre de télécharger un fichier avec une extension .csv.

Était-ce utile?

La solution

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

Éditer: Voici un extrait de code que j'utilise pour éventuellement encoder les champs CSV:

function maybeEncodeCSVField($string) {
    if(strpos($string, ',') !== false || strpos($string, '"') !== false || strpos($string, "\n") !== false) {
        $string = '"' . str_replace('"', '""', $string) . '"';
    }
    return $string;
}

Autres conseils

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

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

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 l'appel, 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 lorsque vous traitez des fichiers contenant plusieurs langues, comme les noms de personnes ou les villes.

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

Tout le monde ici explique comment créer le fichier CSV, mais manque 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 utiliser par exemple 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

Créez votre fichier, puis renvoyez-y 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);

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

Commencez par créer des données sous forme de chaîne avec une virgule comme séparateur (séparé par un ","). 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);
*/

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 = 

Hé ça marche très bien .... !!!! Merci Peter Mortensen et Connor Burton

<*>

? >

GET["start"]; $end =

Hé ça marche très bien .... !!!! Merci Peter Mortensen et Connor Burton

<*>

? >

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 les versions ultérieures.

Vous pouvez simplement écrire vos données dans CSV en utilisant la fonction fputcsv . Voyons l'exemple ci-dessous. Ecrivez 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);

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'); 

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

Utiliser:

$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 mets juste le code total pour qu'un débutant reçoive une aide totale

<?php
extract(

Déjà une très bonne solution est venue. Je mets juste le code total pour qu'un débutant reçoive une aide totale

<a href="csv-download.php?table=tbl_vfm"><img title="Download as Excel" src="images/Excel-logo.gif" alt="Download as Excel" /><a/>

J'ai enregistré ce code dans le fichier csv-download.php

Maintenant, voyez comment j'ai utilisé ces données pour télécharger un fichier csv

<*>

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

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 le fichier csv-download.php

Maintenant, voyez comment j'ai utilisé ces données pour télécharger un fichier csv

<*>

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

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.

É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 Composer. Si vous ne connaissez pas le compositeur, je vous recommande vivement de consulter: 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 un peu une 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 à l’aide de fopen ($ CSVFileName, & # 8216; wb & # 8217;).

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

En voici un que j’ai fait 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(

En voici un que j’ai fait auparavant, en récupérant des données entre certaines dates. J'espère que ça aide.

<*>GET["start"]); $end = mysql_real_escape_string(

En voici un que j’ai fait auparavant, en récupérant des données entre certaines dates. J'espère que ça aide.

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

Mettez dans la variable $ output les données CSV et faites écho avec les en-têtes appropriés

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top