Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1310 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  fputcsv PHP5 (gerer les espaces, les apostrophes etc...)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

fputcsv PHP5 (gerer les espaces, les apostrophes etc...)

n°1860693
Eldren
Posté le 12-03-2009 à 12:03:36  profilanswer
 

Hello,
 
Ma question est toute simple :
 
Comment fputcsv gère les espaces, quotes etc ?
 
j'ai essayé divers tests tels que :
 
celui ci marche :

Code :
  1. $list5 = array
  2.  (
  3.  "Peter;Griffin;Oslo;Norway",
  4.  "Glenn;Quagmire;Oslo;Norway",
  5.  );
  6.  foreach ($list5 as $line)
  7.    {
  8.   fputcsv($fp,split(',',$line));
  9.    }


 
 
 
le même mais en essayant de gérer les espaces, apostrophes etc :
ici ca ne marche plus, il me sort toute la première ligne dans la même colonne

Code :
  1. $list5 = array
  2.  (
  3.  "'Peter et titi';'Griffin a l''eau à la bouche';Oslo;Norway",
  4.  "Glenn;Quagmire;Oslo;Norway",
  5.  );
  6.  foreach ($list5 as $line)
  7.    {
  8.   fputcsv($fp,split(',',$line));
  9.    }


 
 
quelqu'un peut-il m'aider svp ? :(

mood
Publicité
Posté le 12-03-2009 à 12:03:36  profilanswer
 

n°1860697
flo850
moi je
Posté le 12-03-2009 à 12:12:55  profilanswer
 

tu as remarqué que dans l'exemple que tu as pompé , les champs sont séparé par des virgules et que tu utilise des points virgules ?  
 
forcement, le split ne rempli plus son usage


---------------

n°1860698
Eldren
Posté le 12-03-2009 à 12:15:09  profilanswer
 

oui c'était bien volontaire les ";" pour pouvoir mettre chaque nom dans des colonnes separees.
Si j'avais laissé les virgules, toute la ligne aurait été dans la meme colonne

n°1860699
flo850
moi je
Posté le 12-03-2009 à 12:18:45  profilanswer
 

non, vu que derrieère tu fais un split  

Code :
  1. $list5 = array
  2. (
  3. "Peter;Griffin;Oslo;Norway",
  4. "Glenn;Quagmire;Oslo;Norway",  //virgule en trop ici , a enlever
  5. );
  6.  
  7. /*
  8. ici le tableau a la structure suivante :
  9. $list5[0] = "Peter;Griffin;Oslo;Norway";
  10. $list5[1] ="Glenn;Quagmire;Oslo;Norway"
  11. */
  12.  
  13. foreach ($list5 as $line)
  14. {
  15.    //$line = "Peter;Griffin;Oslo;Norway";
  16.    //split(',' , $line) retourne un tableau dont la premire case contient  "Peter;Griffin;Oslo;Norway"; vu que $line ne contient pas de virgule , split ne coupe rien
  17.     fputcsv($fp,split(',',$line));
  18.  
  19.  
  20. }


 
 


---------------

n°1860701
Eldren
Posté le 12-03-2009 à 12:25:56  profilanswer
 

oui ca me parait bizarre aussi, pourtant avec les ";"  il me met bien chaque nom dans une colonne séparée :s
 
mais admettons que je fasse sans split, juste ca :

Code :
  1. $list5 = array("Peter;Griffin;Oslo;Norway" );
  2. fputcsv($fp,$list5);


 
bon là aussi ca va marcher je pense. Mais ca ne me résoud pas mes problèmes de gestion d'espaces (dans le cas ou j'ai "Peter Jackson;Griffin" --> tout sera sur une colonne) :(

n°1860737
flo850
moi je
Posté le 12-03-2009 à 14:02:10  profilanswer
 

il te le mets dans le colonnes séparées par hasard :d

 

en fait, fputcsv a l'impression d'ecrire une seule donnée ( contenant des ; ) , mais lors de la lecture, les points virgules sont interprétés comme des séparateurs de colonnes

 

tu récupères tes données comment ?

 

quand je dois générer un csv, je construit un tableau a deux dimensions. Pour tes données , ça donne :

Code :
  1. $list5 =  array(
  2.                array("Peter","Griffin","Oslo","Norway" ),
  3.                array("Glenn","Quagmire","Oslo","Norway" )
  4. );
 

et ensuite, j'utilise fputcsv

Code :
  1. foreach ($list5 as $line)
  2. {
  3. //$line est bien un tableau
  4.     fputcsv($fp,$line);
  5. }
 



Message édité par flo850 le 12-03-2009 à 14:02:40

---------------

n°1860757
Eldren
Posté le 12-03-2009 à 14:53:51  profilanswer
 

merci de ton aide, en fait j'ai trouvé c'était vraiment débile ...
 

Code :
  1. $list5 = array
  2.  (
  3.  "Peter de la villardière de l'eau;Griffin;Oslo;Norway",
  4.  "Glenn;Quagmire;Oslo;Norway"
  5.  );
  6. foreach ($list5 as $line)
  7.     fputcsv($fp,split(';',$line), ';');


 
le soucis venait simplement de mon excel qui prenait les ; comme délimiteur  
je devais donc préciser a fputcsv le ';' en 2eme paramètre...lol
 

n°1871567
karpediem
Posté le 09-04-2009 à 14:53:56  profilanswer
 

Bonjour @ toutezéatous,
 
Je me suis inspirée de ce code pour générer un fichier excell (.csv) avec les données d'une table sql. Tout a l'air de bien fonctionner (je n'ai aucun message d'erreur) mais le fichier généré est vide ;-( Je n'ai même pas le nom des champs...
J'y ai passé mon après-midi mais là je craque un peu (en fait à mort !!) alors je viens vous demander un petit peu d'aide...
 
La version de PHP  est la 5.2.5
 
Voici mon code :
 

Code :
  1. $fname = "tracking.csv" ;
  2.     $sql = 'SELECT * FROM tracking' ;
  3.     mysql_select_db($sql_bdd, $bdd_link) or die(mysql_error());
  4.     $result = mysql_query($sql, $bdd_link) or die(mysql_error());
  5.     if (!$result) die('Pb dans la generation du fichier');
  6.     $num_fields = mysql_num_fields($result);
  7.     $headers = array();
  8.     for ($i = 0; $i < $num_fields; $i++) {
  9.         $headers[] = mysql_field_name($result , $i);
  10.     }
  11.     $fp = fopen($fname, 'w');
  12.     if ($fp == false) {die("Impossible d'ecrire dans le fichier" );}
  13.     if ($fp && $result) {
  14.         //header('Content-Type: text/csv'); ///// J'ai essayé les 2
  15.         header('Content-type: application/vnd.ms-excel');
  16.         header('Content-Disposition: attachment; filename="tracking.csv"');
  17.         header('Pragma: no-cache');
  18.         header('Expires: 0');
  19.         fputcsv($fp, $headers);
  20.         while($row = mysql_fetch_row($result)){
  21.            fputcsv($fp, $row);       
  22.         }
  23.     }
  24. fclose($fp);
  25. mysql_close();
  26. exit();


 
J'ai essayé :

Code :
  1. fputcsv($fp, $row,"\t" );
  2. fputcsv($fp, array_values($row));
  3. fputcsv($fp, $row,";" );


 
Avec le même résultat...
 
J'ai aussi essayé pour le fun de mettre un fwrite("toto" ) juste après le fopen() mais toujours rien, c'est vide !
 
J'ai vérifié ma table qui est bien alimentée et si je fait un print_r($row), j'obtiens bien mes valeurs :
 

Code :
  1. Array ( [0] => 25 [1] => 33 [2] => 886a0d1d527ebf8259e69c9a59a3b9d5 [3] => demo@laposte.net [4] => 2009-04-02 14:16:17 [5] => /selection-immobiliere-biens-preferes.php [6] => )
  2. Array ( [0] => 29 [1] => 33 [2] => 886a0d1d527ebf8259e69c9a59a3b9d5 [3] => demo@laposte.net [4] => 2009-04-02 14:23:21 [5] => /ventes-flash-prix-promotionnels.php [6] => filtre_region=-1 ; tri_ordre=cp_asc ; )


 
Si vous avez une idée ce serait super cooooooooooool !
 
Merci @ toutezéatous et excellente soirée !

n°1871640
macgawel
Posté le 09-04-2009 à 16:00:56  profilanswer
 

karpediem a écrit :

Code :
  1. $result = mysql_query($sql, $bdd_link) or die(mysql_error());
  2.    if (!$result) die('Pb dans la generation du fichier');



Juste en passant : le if ne sert à rien : si mysql_query plante, tu passes dans le die(mysql_error()).
Et s'il ne plante pas ta condition (!$result) n'est pas vérifiée...
 

Citation :

J'ai aussi essayé pour le fun de mettre un fwrite("toto" ) juste après le fopen() mais toujours rien, c'est vide !

Tu as fais

Code :
  1. $fp = fopen($fname, 'w');
  2. fwrite($fp, "toto" );
  3. fclose($fp);

et tu as un fichier vide ?!
Vérifie les droits et l'espace disponible... Parce que je ne vois pas trop, au niveau de PHP, où est le problème.
Tu peux aussi essayer :
$test = fputcsv($fp, $row) or die ("Erreur" );

n°1871676
karpediem
Posté le 09-04-2009 à 16:52:46  profilanswer
 

Bonjour macgawel et merci pour cette réponse ultra-rapide !
 
Si je fais :

Code :
  1. $fp = fopen($fname, 'w');
  2. fwrite($fp, "toto" );
  3. fclose($fp);


ça me créé bien un fichier là où j'ai indiiqué, sur le serveur avec 'toto' dedans.
Du coup, j'ai utilisé ma boucle :

Code :
  1. while($row = mysql_fetch_row($result)){
  2. fputcsv($fp, $row) or die ("Erreur" );
  3. }


Et c'est bon ! ça me créé bien sur le serveur le bon fichier au bon format.
Du coup, ce qui ne va pas, c'est ma partie des "header" qui devrait me permettre d'enregistrer mon fichier en local là où je veux...J'ai essayé d'inverser la génération du fichier avec les instructions header pensant que peut-être le fichier n'était pas encore généré au moment de la sauvegarde, mais ça n'a rien changé...
 
Une nouvelle idée ?
 
Déjà un grand MERCI pour ce début de diagnostic !!!

mood
Publicité
Posté le 09-04-2009 à 16:52:46  profilanswer
 

n°1871681
macgawel
Posté le 09-04-2009 à 17:03:19  profilanswer
 

Citation :

N'oubliez jamais que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP. Une erreur très classique est de lire un fichier avec include() ou require(), et de laisser des espaces ou des lignes vides, qui produiront un affichage avant que la fonction header()  ne soit appelée. Le même problème existe avec les fichiers PHP/HTML standards.

php:header

n°1871685
karpediem
Posté le 09-04-2009 à 17:17:55  profilanswer
 

Voici le code complet de ma page, je n'arrive pas à identifier ce qui peux merdouiller...
 

Code :
  1. <?php
  2. //------------ connexion
  3. require_once('config/connexion.php');
  4. session_start(); // début de session
  5. //----------------- export -------------------------------
  6. if (isset($_POST['GO']))
  7. {
  8. $fname = "tracking.csv" ;
  9. $sql = 'SELECT * FROM tracking' ;
  10. mysql_select_db($sql_bdd, $bdd_link) or die(mysql_error());
  11. $result = mysql_query($sql, $bdd_link) or die(mysql_error());
  12. if (!$result) die('Pb dans la generation du fichier');
  13. $num_fields = mysql_num_fields($result);
  14. $headers = array();
  15. for ($i = 0; $i < $num_fields; $i++) {
  16.  $headers[] = mysql_field_name($result , $i);
  17. }
  18. $fp = fopen($fname, 'w');
  19. header("Content-Disposition: attachment; filename=$fname" );
  20. header("Content-Type: text/csv" );
  21. header("Pragma: no-cache" );
  22. header("Expires: 0" );
  23. fputcsv($fp, $headers);
  24. while($row = mysql_fetch_row($result)){
  25.  fputcsv($fp, $row) or die ("Erreur" );
  26. }
  27.     fclose($fp);
  28. mysql_close();
  29. }
  30. ?>
  31. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  32. <html xmlns="http://www.w3.org/1999/xhtml">
  33. etc... ma page html avec un bouton dans un formulaire pour lancer l'export


 
Tu vois quelque chose qui pourrait faire que ça ne va pas ?
 
Merci et @ +

n°1871686
karpediem
Posté le 09-04-2009 à 17:19:13  profilanswer
 

Maintenant j'ai le contenu de ma page html dans mon fichier...

n°1871690
karpediem
Posté le 09-04-2009 à 17:22:27  profilanswer
 

Peut-être que je devrais mettre mon traitement dans un fichier à part... ça pourrait être ça le pb ?

n°1871751
karpediem
Posté le 09-04-2009 à 19:11:37  profilanswer
 

ça y est j'ai trouvé !!!!
 
Il fallait mettre à la fin  ce 2 instructions :
 

Code :
  1. readfile($fname);
  2. exit();


 
Un grand MERCI à tous ceux et celles qui nous aident à réfléchir !
 
Excellente soirée @ toutezéatous !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  fputcsv PHP5 (gerer les espaces, les apostrophes etc...)

 

Sujets relatifs
[Pascal / SDL] Problème pour gérer les Threads[VB6] Générer un certain nombre d'espaces
[ Resolu ] Faille de sécuirté, comment gérer les variables ?comment bien gérer les parametres de fonctions en bash ?
Gerer les DblClick sur les UserFormComment gérer des catégories et sous catégories ?
Passage de PHP4 a PHP5 problème de condition[résolu] Espaces et preg_replace
xampp windows 2000 serveur mysql php5 
Plus de sujets relatifs à : fputcsv PHP5 (gerer les espaces, les apostrophes etc...)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR