Page 1 sur 1

créer un fichier csv à partir de données mysql

Posté : 28 août 2007, 09:46
par sam01
Bonjour,

j'aimerais récuprer les données d'un table d'une base mysql et les mettre dans un fichier csv.
Et j'aimerais que ce fichier csv soir enregistré sur mon serveur.

Merci d'avance pour votre aide.

Posté : 28 août 2007, 10:14
par Ryle
phpMyAdmin fait ça très bien il me semble :)

sinon tu peux utiliser la fonction fputcsv() pour créer assez facilement un fichier de type csv

Posté : 28 août 2007, 10:19
par zeus
Tiens, tu me rappelles que je doit faire un tutorial sur l'instruction "SELECT INTO outfile" :-k

En attendant, il reste que c'est l'instruction que je te conseille d'utiliser ;)

Le principe général, c'est que tu écrit ton SELECT pour qu'il te sélectionne les données que tu veux afficher dans ton fichier CSV, puis tu rajoute la ligne "INTO OUTFILE 'adresse/de/ton/fichier.csv' entre le SELECT et le FROM.
Sans option, il utilise la syntaxe par défaut des fichiers CSV, mais tu peux utiliser quelques options : cf documentation (Recherche la chaine "INTO OUTFILE")

Exemple d'utilisation :

Code : Tout sélectionner

SELECT champ1, champ2 INTO OUTFILE "/home/data/export_table1.csv' FROM table1
fichier export_table1.csv

Code : Tout sélectionner

val11 val21 val21 val22 val31 val32

Posté : 28 août 2007, 10:24
par Ryle
Tiens, je ne connaissais pas.. en tout cas je sens que ça va me servir :)

Posté : 28 août 2007, 15:13
par sam01
je te remercie j'avias bien pensé à la focntion select oufile mais j'ai des problème d'autorisation sur mon serveur, il me dit user not autorised...

alors je me suis rabattu sur lla méthode suivante :

	$request = "SELECT * FROM lldiffusion_produit";
	if ($result = mysql_query($request))
	{
		while($ligne = mysql_fetch_row($result))
		{
			$id = $ligne[0];
			$marque= $ligne[1];
			$desigantion = $ligne[2];
			$univers = $ligne[3];
			$categorie = $ligne[4];
			$sous_categorie = $ligne[5];
			$resume_court = $ligne[6];
			$prix_ttc = $ligne[8];
			$frais_port = $datap['frais_port_inf'];
			$disponibilité = $ligne[9];
			$chaine ="$id;$marque;$designation;$univers $categorie $sous_vcategorie;$resume_court;$prix_tcc;$frais_port;$disponibilité;\r";
			fputcsv($fp, $chaine); 
		} 
	}	

mais j'ai le message d'errur suivant :

Fatal error: Call to undefined function: fputcsv() in /home.10.3/lldiffus/www/gerant_new_new.php on line 65


j'ai l'impression que la focntion fputcsv n'est pas connue./
Existet-il quelque chose qui remplacerais cette focntion?
Merci d'avance pour votre aide.

Posté : 28 août 2007, 15:32
par Ryle
Ok, ca veut dire que tu ne dois pas être en php5 si la fonction n'est pas présente... bah du coup je crois que tu en est réduit à un simple fputs() ou fwrite().

Après selon le type des données que tu récupères, pour les convertir au format csv par défaut, il te faut, uniquement pour les chaines de caractères, si la chaine contient au moins une guillemet ou un retour à la ligne :
- doubler toutes les guillemets qu'elle contient (avec str_replace() par exemple)
- et encapsuler la chaine avec des guillemets

Après il n'y a plus qu'à l'insérer dans ton fichier, et ouvrir le fichier généré dans ton tableur préféré pour voir le résultat :)

Posté : 28 août 2007, 16:33
par orgerix
Ou alors qu'elle est desactivé par l'hébergeur.

Posté : 28 août 2007, 16:36
par zeus
Pour les authorisations d'accès MySQL/PHP, c'est simple, il te suffit d'écrire ton fichier dans le répertoire /tmp et de le déplacer via PHP avec un rename() ;)

Posté : 29 août 2007, 11:30
par sam01
j'obtiens exactement le mêm message avec cela :

SELECT * 
INTO OUTFILE '/tmp/lldiffusion_export.csv'
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
FROM lldiffusion_produit 

le message d'erreur est :

#1045 - Access denied for user: 'lldiffusion@%' (Using password: YES)

Posté : 29 août 2007, 19:30
par Invité
Du coup je recopie ma réponse :


première remarque, \r est le signe de fin de ligne sous Mac. Sous Unix c'est \n. et sous windows, \r\n.

Je te conseille d'utiliser la constante
PHP_EOL
pour rendre ton compte portable et être sur d'obtenir le caractère de fin de ligne.