Code PHP pour convertir une requête MySQL en CSV [fermé]
128
Quel est le moyen le plus efficace de convertir une requête MySQL en CSV en PHP s'il vous plaît?
Il serait préférable d'éviter les fichiers temporaires car cela réduit la portabilité (chemins de répertoire et configuration des autorisations du système de fichiers requises).
Le CSV doit également inclure une ligne supérieure de noms de champ.
Pourquoi cette question a-t-elle été fermée comme non constructive? Celui-ci est beau et parfaitement clair.
14
@Alec Parce que certains modérateurs ici sont des super modérateurs, vous savez ... "Avec les superpuissances, il y a une grande responsabilité!" - Uncle Ben
finitenessofinfinity
18
Le pouvoir @finitenessofinfinity corrompt, le pouvoir absolu corrompt absolument. Stackoverflow en est un excellent exemple.
16
Je vote pour rouvrir cette question!
TN888
9
Six mois plus tard et j'utilise les réponses à cela dans mon site Web. Cela peut-il être rouvert?
Jon
Réponses:
138
SELECT * INTO OUTFILE "c:/mydata.csv"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY "\n"
FROM my_table;
Notez l'utilisation de barres obliques avec SELECT INTO OUTFILEmême sur Windows.
Johan
1
Hii cela fonctionne bien pour le format xls mais si j'essaie d'enregistrer en tant que fichier CSV, tous les résultats s'affichent dans 1 colonne. Je veux l'enregistrer en tant que fichier csv.
vinod reddy
Parmi au-dessus de deux, lequel est le meilleur, le plus sûr et pourquoi?
Chella
1
J'aurais tendance à suggérer que la deuxième option est plus sûre car `SELECT INTO OUTFILE nécessite que l'utilisateur mysql ait accès au système de fichiers pour modifier les fichiers, ce qui représente un risque potentiellement important.
Jeepstone
91
Découvrez cette question / réponse . Il est plus concis que celui de @ Geoff et utilise également la fonction intégrée fputcsv.
Au cas où quelqu'un d'autre serait aussi stupide que moi, ne le remplacez pas php://outputpar un nom de fichier réel ou n'essayez pas de le fermer par un fcloseà la fin: ce n'est pas un vrai fichier, juste un alias pour le flux de sortie. Quoi qu'il en soit, cette réponse a parfaitement fonctionné pour moi, merci Jrgns!
Pour une raison quelconque, $ fp me renvoie false.
Volatil3
Pour MySQL moderne, vous pouvez utiliser: $ headers [] = mysqli_fetch_field_direct ($ result, $ i) -> nom;
Ben en Californie
Et changez les autres fonctions mysql_ en fonctions mysqli_.
Ben en Californie
6
Si vous souhaitez que le téléchargement soit proposé sous forme de téléchargement pouvant être ouvert directement dans Excel, cela peut fonctionner pour vous: (copié à partir d'un ancien projet inédit)
Ces fonctions configurent les en-têtes:
function setExcelContentType(){if(headers_sent())returnfalse;
header('Content-type: application/vnd.ms-excel');returntrue;}function setDownloadAsHeader($filename){if(headers_sent())returnfalse;
header('Content-disposition: attachment; filename='. $filename);returntrue;}
Celui-ci envoie un CSV à un flux en utilisant un résultat mysql
Merci john code très utile. J'ai dû modifier une ligne pour la fonction csvFromResult. au lieu de while ($ row = mysql_fetch_row ($ result)) {fputcsv ($ stream, $ row); $ lignes ++; }, j'ai dû utiliser while ($ row = mysql_fetch_row ($ result)) {$ data [] = $ row; // fputcsv ($ stream, $ row); // $ lignes ++; } foreach ($ data as $ d) {fputcsv ($ stream, $ d); }. merci encore pour un code si merveilleux.
codingbbq
3
// Export to CSVif($_GET['action']=='export'){
$rsSearchResults = mysql_query($sql, $db)ordie(mysql_error());
$out ='';
$fields = mysql_list_fields('database','table',$db);
$columns = mysql_num_fields($fields);// Put the name of all fieldsfor($i =0; $i < $columns; $i++){
$l=mysql_field_name($fields, $i);
$out .='"'.$l.'",';}
$out .="\n";// Add all values in the tablewhile($l = mysql_fetch_array($rsSearchResults)){for($i =0; $i < $columns; $i++){
$out .='"'.$l["$i"].'",';}
$out .="\n";}// Output to browser with appropriate mime type, you choose ;)
header("Content-type: text/x-csv");//header("Content-type: text/csv");//header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=search_results.csv");
echo $out;exit;}
Réponses:
( la documentation à ce sujet est ici: http://dev.mysql.com/doc/refman/5.0/en/select.html )
ou:
la source
SELECT INTO OUTFILE
même sur Windows.Découvrez cette question / réponse . Il est plus concis que celui de @ Geoff et utilise également la fonction intégrée fputcsv.
la source
php://output
par un nom de fichier réel ou n'essayez pas de le fermer par unfclose
à la fin: ce n'est pas un vrai fichier, juste un alias pour le flux de sortie. Quoi qu'il en soit, cette réponse a parfaitement fonctionné pour moi, merci Jrgns!Consultez la documentation concernant la syntaxe SELECT ... INTO OUTFILE.
la source
Une mise à jour de la solution @jrgns (avec quelques légères différences de syntaxe).
la source
Si vous souhaitez que le téléchargement soit proposé sous forme de téléchargement pouvant être ouvert directement dans Excel, cela peut fonctionner pour vous: (copié à partir d'un ancien projet inédit)
Ces fonctions configurent les en-têtes:
Celui-ci envoie un CSV à un flux en utilisant un résultat mysql
Celui-ci utilise la fonction ci-dessus pour écrire un CSV dans un fichier, donné par $ filename
Et c'est là que la magie opère;)
Par exemple:
la source
la source