exporter le resultat d'une requete en fichier csv

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : exporter le resultat d'une requete en fichier csv

Re: exporter le resultat d'une requete en fichier csv

par stealth35 » 02 mars 2011, 12:53

et si y'a un ; dans le champs ?

Re: exporter le resultat d'une requete en fichier csv

par Memelo » 02 mars 2011, 12:38

Bonjour,

A la recherche moi aussi d'un script permettant de télécharger un csv suivant un requête SQL j'en ai trouvé un très simple qui m'a bien servi...
Alors si ça peut profiter à d'autre...

//on récupère les infos dans la bdd
$query = "SELECT champs1,champ2 FROM ma_table"; 
$result = mysql_query($query) or die (mysql_error());


if(mysql_num_rows($result)>0) {
header('Content-Type: application/csv'); //type fichier
header("Content-Disposition: attachement; filename=fichier.csv"); //nom fichier

echo "Intitule1,intitule2\r\n";

while (($article = mysql_fetch_assoc($result))!= false){

//modification de certaines valeurs en valeurs en numérique
	if($article['mode_paiement'] == "cb"){$article['mode_paiement'] = 1;} 
	if($article['mode_paiement'] == "chq"){$article['mode_paiement'] = 2;}
	if($article['mode_paiement'] == "vir"){$article['mode_paiement'] = 3;}
	echo implode(';', $article) . "\r\n";
}
}
else die('Query Error');


C'est tout.
Plutot simple non ?

Re: exporter le resultat d'une requete en fichier csv

par AB » 19 févr. 2011, 03:52

Pour l'instant, j'ai essayer de mettre ce que vous m'avez dit, mais je comprend pas comment cela fonctionne, ou je doit mettre les header ... et ca fonctionne pas car je pense que je ne fait pas comme il faudrait faire. je vais essayer de me pencher dessus dimanche et je reviens vers vous.
Ok et montres nous ce que tu as fait :)

Re: exporter le resultat d'une requete en fichier csv

par ptiloup21 » 19 févr. 2011, 00:07

Pour l'instant, j'ai essayer de mettre ce que vous m'avez dit, mais je comprend pas comment cela fonctionne, ou je doit mettre les header ... et ca fonctionne pas car je pense que je ne fait pas comme il faudrait faire. je vais essayer de me pencher dessus dimanche et je reviens vers vous.

Re: exporter le resultat d'une requete en fichier csv

par herve29 » 16 févr. 2011, 09:50

L'instruction header fonctionne bien et fait exactement ce que je veut.
Merci pour vos informations précieuses.

Re: exporter le resultat d'une requete en fichier csv

par AB » 15 févr. 2011, 18:37

Si ca derange pas, je prefere, fournir le fichier (13ko) possibilite par mail si vous voulez ou sinon dite moi.
Non on veut pas tout ton code, juste celui qui nous intéresse pour ton problème c'est à dire faire la requête, mettre tes enregistrements sous forme d'un fichier csv puis proposer celui-ci en téléchargement, soit le premier code que tu nous a donné mais adapté avec les conseils ci-dessus. Et on règle les problèmes sur le forum pour que tout le monde en profite :)

Bon donc pour proposer le fichier temporaire en téléchargement, il faut rajouter quelques lignes de code en lieu et place du commentaire "//les headers à mettre ici" Voici donc ces headers (pour plus d'info voir le lien donné par xTG) et le moyen de récupérer la taille du fichier :
//...
$info = stream_get_meta_data($handle);

$filesize = filesize($info['uri']);

$nom_du_fichier = 'monfichier'; //à définir

// Entêtes pour forcer le téléchargement, type de fichier, poids, disposition
header('Content-Type: application/octet-stream');	
header("Content-Transfer-Encoding: text/csv");
header("Content-Length: ".$filesize);
header("Content-Disposition: attachment; filename=\"".$nom_du_fichier."\"");

// Différents code pour ne pas mettre le fichier dans le cache du navigateur
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, public");
header("Pragma: no-cache"); 
header("Expires: 0"); 

//Remise à zéro, envoi du fichier, puis effacement, puis sortie du script.
rewind($handle);
fpassthru($handle);
fclose($handle);
exit;
@PTILOUP21 alors tu l'a fait le début du code (la requête) ?
Que donne echo $ids; comme je disais plus haut ? Montres nous ce que tu as fait.

Re: exporter le resultat d'une requete en fichier csv

par xTG » 15 févr. 2011, 17:36

La fonction header() de PHP suffit pour forcer un téléchargement.
Une base ici : http://www.apprendre-php.com/tutoriels/ ... chier.html
A améliorer cependant, car leur code ne vérifie en rien le fichier. ;)

Re: exporter le resultat d'une requete en fichier csv

par PTILOUP21 » 15 févr. 2011, 17:31

Si ca dérange pas, je préfère, fournir le fichier (13ko) possibilité par mail si vous voulez ou sinon dite moi.
je rajoute a mon précédant message : Moi aussi, il faut que ca m'ouvre une fenêtre enregistrer sous. Mais je n'arrive déjà pas a modifier ma page pour faire la création du csv.

Re: exporter le resultat d'une requete en fichier csv

par herve29 » 15 févr. 2011, 10:54

Bonjour,
Je me permet de participer à ce post car , j'ai à traiter un besoin similaire. et je ne suis pas un expert en php

Merci pour le petit bout de code de stealh35, qui m'a fait gagner du temps.

J'arrive bien à créer le fichier csv sur le serveur,
mais j'aimerais plutôt avoir un bouton qui me donne une invite de type "enregister sous...", pour que le fichier soit enregistré sur le PC de l'utilisateur.

Je pense que c'est possible, peut être en passant par javascript? J'imagine qu'il existe une fonction pour ça?

En tout cas, merci d'avance pour vos suggestions.

Re: exporter le resultat d'une requete en fichier csv

par ptiloup21 » 15 févr. 2011, 10:26

Si ca derange pas, je prefere, fournir le fichier (13ko) possibilite par mail si vous voulez ou sinon dite moi.

Re: exporter le resultat d'une requete en fichier csv

par AB » 15 févr. 2011, 01:40

Au passage, toujours à propos du code de stealth35, pour ceux qui voudraient utiliser l'extension mysqli, il n'existe pas de fonction mysqli_unbuffered_query.
C'est dans le troisième paramètre (en mode procédural) de mysqli_query que l'on indique MYSQLI_USE_RESULT pour avoir le même comportement. Cela dit cette technique de ne pas stocker les résultats n'est nécessaire (ou recommandée) que pour un gros volume de requête (ie, y'aurait quelques désavantages à l'utiliser systématiquement, cf la doc).

Re: exporter le resultat d'une requete en fichier csv

par AB » 15 févr. 2011, 01:23

Commençons par le début.

stealth35 t'a donné le résultat de ce que tu devrais obtenir pour éviter la boucle inutile qui construit ta requête.
SELECT * FROM `publipostage` WHERE `id` IN(1, 25, 68, 64, 87)
(les chiffres à l'intérieur du IN étant tes ID)

Dans ton code tu écris
$ids = explode (";", $ids );
Si à la place tu fais
$ids = implode (",", $ids );
echo $ids;
ça donne quoi ? ça ressemble pas un peu à ce qu'on peut mettre dans la clause IN de la requête indiquée plus haut ?

Réécris le code que tu nous à montré en suivant ces conseils ensuite on ira plus loin.

Cela dit pour la suite stealth35 t'a mâché le travail.

Juste dans son code, avant les headers tu auras peut-être besoin de faire
$info = stream_get_meta_data($handle);
$filesize = filesize($info['uri']);
(si tu veux passer la taille du fichier en téléchargement)

Re: exporter le resultat d'une requete en fichier csv

par ptiloup21 » 14 févr. 2011, 23:37

Merci a tous, je comprend pas tout ce que vous me dite mais bon, je vais essayer, sinon, si je fourni le fichier complet, est-ce que quelqu'un, peut me faire les modifs et m'expliquer ?

Merci d'avance a tous.

Re: exporter le resultat d'une requete en fichier csv

par stealth35 » 14 févr. 2011, 20:07

je te conseil d'utiliser un fichier temporaire pour créer ton CSV le couple tmpfile + fgetcsv c'est que du bonheur
pour ta requête pas besoin de t'embêter non plus a faire un boucle un simple IN va suffir (remplacer les ; par ,)
SELECT * FROM `publipostage` WHERE `id` IN(1, 25, 68, 64, 87)
tu peux ensuite créer le CSV très simplement comme ca :
$sql = "SELECT * FROM `test`";
 
$result = mysql_unbuffered_query($sql);
$handle = tmpfile();
$fields = mysql_fetch_assoc($result);
 
fputcsv($handle, array_keys($fields));
 
do
{
    fputcsv($handle, $fields);
}
while($fields = mysql_fetch_assoc($result));
 
mysql_free_result($result);
 
//les headers à mettre ici
rewind($handle);
fpassthru($handle);
fclose($handle);
exit;

Re: exporter le resultat d'une requete en fichier csv

par Aureusms » 14 févr. 2011, 19:57

Sert toi aussi des caches ob_start(), ob_get_contents() et ob_end_flush(),... pour mettre en cache ce que tu veux ensuite afficher via les fonctions header.