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

fputcsv PHP5 (gerer les espaces, les apostrophes etc...) - PHP - Programmation

Marsh Posté le 12-03-2009 à 12:03:36    

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 ? :(

Reply

Marsh Posté le 12-03-2009 à 12:03:36   

Reply

Marsh Posté le 12-03-2009 à 12:12:55    

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


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

Reply

Marsh Posté le 12-03-2009 à 12:15:09    

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

Reply

Marsh Posté le 12-03-2009 à 12:18:45    

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. }


 
 


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

Reply

Marsh Posté le 12-03-2009 à 12:25:56    

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) :(

Reply

Marsh Posté le 12-03-2009 à 14:02:10    

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

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

Reply

Marsh Posté le 12-03-2009 à 14:53:51    

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
 

Reply

Marsh Posté le 09-04-2009 à 14:53:56    

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 !

Reply

Marsh Posté le 09-04-2009 à 16:00:56    

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" );

Reply

Marsh Posté le 09-04-2009 à 16:52:46    

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 !!!

Reply

Marsh Posté le 09-04-2009 à 16:52:46   

Reply

Marsh Posté le 09-04-2009 à 17:03:19    

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

Reply

Marsh Posté le 09-04-2009 à 17:17:55    

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 @ +

Reply

Marsh Posté le 09-04-2009 à 17:19:13    

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

Reply

Marsh Posté le 09-04-2009 à 17:22:27    

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

Reply

Marsh Posté le 09-04-2009 à 19:11:37    

ç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 !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed