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.
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;
}
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 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.
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.
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&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
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);
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 ","). 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 = $_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 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);
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;
}
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à 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.
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);
}
Pour l'envoyer en tant que 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 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.
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;
}
?>
<?
// 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 );
?>
É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:
Vous devrez utiliser compositeur. Si vous ne savez pas ce que composer est _, je vous recommande vivement de jeter un oeil à: https://getcomposer.org/