8721 sujets

Développement web côté serveur, CMS

Salut à tous,
j'ai un petit bout de code que exporte une bdd dans un fichier csv.
Jusqu’à la pas de blem.
par contre j'aurai besoin d'ajouter un ";" a la fin de chaque email dans le fichier exporter.


// la variable qui va contenir les données CSV
$outputCsv = '';

// Nom du fichier final
$fileName = 'export-liste-partenaire.csv';

$requete = "SELECT   mail,nom,adresse,cp,ville,tph  FROM user WHERE lvl=1 ORDER BY nom ASC";
$sql = mysql_query($requete);
if(mysql_num_rows($sql) > 0)
{
    $i = 0;

    while($Row = mysql_fetch_assoc($sql))
    {
        $i++;
		$lemail=$Row["mail"];
        // Si c'est la 1er boucle, on affiche le nom des champs pour avoir un titre pour chaque colonne
        if($i == 1)
        {
			$outputCsv = 'Mail;Nom;Adresse;Code_Postal;Ville;Telephone';
			$outputCsv .= "\n";
        }
		$Row["mail"]= empty($Row["mail"]) ? "" :  $Row["mail"].";";
        // On parcours $Row et on ajout chaque valeur à cette ligne
        foreach($Row as $clef => $valeur)
		
            $outputCsv .= trim(utf8_decode($valeur=str_replace(array('&#039;',"\n","<br />"),array('\''," "," "),$valeur))).";";

        // Suppression du ; qui traine à la fin
        $outputCsv = rtrim($outputCsv, ";");

        // Saut de ligne
        $outputCsv .= "\n";

    }

}
else
    exit('Aucune donnée à enregistrer.');
  

// Entêtes (headers) PHP qui vont bien pour la création d'un fichier Excel CSV
header("Content-disposition: attachment; filename=".$fileName);
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: application/vnd.ms-excel\n");
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");

echo $outputCsv;
exit();


le souci c'est qu'il prends le ";" que j'ajoute dans la colonne email comme un delimiteur. et donc cela pose probleme dans la génération du fichier csv.

Merci de votre aide
Modifié par spawns (05 Nov 2013 - 01:37)
bonjour,
effectivement cela ne fonctionne pas le "\;"
par contre entourer avec des double "" je veux bien, mais je vois pas trop comment faire dans ma boucle foreach

Si qql'un peux m'aider ???
Modifié par spawns (05 Nov 2013 - 10:00)
Et si tu remplaces cette ligne :
$outputCsv .= trim(utf8_decode($valeur=str_replace(array('&#039;',"\n","<br />"),array('\''," "," "),$valeur))).";";

par
$outputCsv .= '"'.trim(utf8_decode($valeur=str_replace(array('&#039;',"\n","<br />"),array('\''," "," "),$valeur))).'"'.";";


Ça donne quoi ?

Edit :
Il faut d'ailleurs que s'il y a une double quote dans ton champ elle soit échappée, donc ça donnerais plutôt un truc comme ça :
$outputCsv .= '"'.trim(utf8_decode($valeur=str_replace(array('&#039;',"\n","<br />",'"'),array('\''," "," ",'\"'),$valeur))).'"'.";";

Modifié par Raphi (05 Nov 2013 - 11:39)
Raphi a écrit :
Et si tu remplaces cette ligne :
$outputCsv .= trim(utf8_decode($valeur=str_replace(array('&amp;#039;',&quot;\n&quot;,&quot;&lt;br /&gt;&quot;),array('\'',&quot; &quot;,&quot; &quot;),$valeur))).&quot;;&quot;;

par
$outputCsv .= '&quot;'.trim(utf8_decode($valeur=str_replace(array('&amp;#039;',&quot;\n&quot;,&quot;&lt;br /&gt;&quot;),array('\'',&quot; &quot;,&quot; &quot;),$valeur))).'&quot;'.&quot;;&quot;;


Ça donne quoi ?

Edit :
Il faut d'ailleurs que s'il y a une double quote dans ton champ elle soit échappée, donc ça donnerais plutôt un truc comme ça :
$outputCsv .= '&quot;'.trim(utf8_decode($valeur=str_replace(array('&amp;#039;',&quot;\n&quot;,&quot;&lt;br /&gt;&quot;,'&quot;'),array('\'',&quot; &quot;,&quot; &quot;,'\&quot;'),$valeur))).'&quot;'.&quot;;&quot;;



Yes, c'est bon
Merci Raphi tu me sort une sacré épine du pied nikel

Encore Merci
@+