Problème de compatibilité export CSV sous Mac

Fermé
LythanaG Messages postés 1 Date d'inscription vendredi 18 mai 2018 Statut Membre Dernière intervention 18 mai 2018 - 18 mai 2018 à 11:01
jordane45 Messages postés 38288 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 15 novembre 2024 - 18 mai 2018 à 14:19
Bonjour a tous,

Après plusieurs recherches sur divers forums, j'ai réussi à exporter des données de ma bdd mysql sur un fichier CSV. Quand je lance le script sur mon navigateur IE tout fonctionne, lorsque l'utilisateur clique sur le lien qui renvoie à mon script export, il voit apparaître une boîte de dialogue qui lui propose de lire ou d'enregistrer le Csv.

Cependant, lorsque je réalise le test à partir d'un mac sous chrome ou mozilla, le fichier Csv apparaît directement sur le navigateur sans donner la possibilité à l'utilisateur de l'enregistrer et mes données ne sont pas affichées comme je l'aimerais (les accents ne sont pas reconnus et la plupart de mes séparateurs ne sont pas affichés).

J'ai fait des recherches sur d'autres forums, je pense que j'ai un problème d'encodage (le format est en UTF-8 )mais je ne sais pas lequel choisir ?
Et je n'ai pas réussi à trouver la solution pour que mon script propose le téléchargement du fichier Csv ? et si ce n'est pas possible j'aimerais qu'il s'affiche au moins avec tous les séparateurs que j'ai ajouté.
Si une âme charitable veut bien m'aider, je t'en serait éternellement reconnaissante

Merci de votre aide !

Voici mon script export en php:

#connexion à la bdd
try {
$bdd = new PDO('mysql:host=localhost;dbname=', '','');
}
catch (Exception $e)
{
die ('Erreur:' .$e->getMessage());
}

#Création du CSV
header("Content-Type: text/csv; charset=UTF-8");
header("Content-disposition: filename=dashboard.csv");

$separateur = ";";
$separateur2 = ";;";

#Tableau 1 Contributeur
$Contributeurs = $bdd->prepare('SELECT Contributeur FROM contributeurs ORDER BY nb_ModifsPCI DESC LIMIT 7 ; '); #requête
$Tableau = "Contributeurs"; #Titre Tableau
$entete = array("Pseudo"); #Entêtes

#Tableau 2 Articles - Modifies
$MoinsModifs = $bdd->prepare('SELECT Titre, DateModif, Contributeur, NombreModifs, Commentaire FROM Articles
ORDER BY NombreModifs
LIMIT 10;');
$Tableau2= 'Articles - Modifiés'; #Titre tableau
$entetes2 = array('Article', 'Date dernière modification', 'Commentaire', 'Contributeur'); #entetes

#Tableau 3 Articles + Modifies
$PlusModifs = $bdd->prepare('SELECT Titre, DateModif, Contributeur, NombreModifs, Commentaire FROM Articles
ORDER BY NombreModifs DESC
LIMIT 10;'); #Requete
$Tableau3= 'Articles + Modifiés';#Titre tableau
$entetes3 = array('Article', 'Date dernière modification', 'Commentaire', 'Contributeur');#entetes

#Tableau 4 Articles + Consultes
$PlusVues = $bdd->prepare('SELECT Titre, NombreVues FROM Articles ORDER BY NombreVues DESC LIMIT 10;'); #Requete
$Tableau4= 'Articles + Consultés';#Titre tableau
$entetes4 = array('Article', 'Nombres de vues');#entetes

#Tableau 5 Articles - Consultes
$MoinsVues = $bdd->prepare('SELECT Titre, NombreVues FROM Articles ORDER BY NombreVues LIMIT 10;'); #Requete
$Tableau5= 'Articles - Consultés';#Titre tableau
$entetes5 = array('Article', 'Nombres de vues');#entetes

#Insertion du contenu
#Tableau 1
echo ($separateur.$Tableau)."\r\n";
echo implode ($separateur,$entete)."\r\n";
$Contributeurs ->execute(array());
While ( $donnees=$Contributeurs -> fetch()) # condition vérifant que les valeurs entrées sont conforment à celles de la bdd
{
// Création du contenu du tableau
$lignes[] = array($donnees["Contributeur"]);
}
foreach ($lignes as $ligne) {
echo implode ($separateur,$ligne)."\r\n";
}
#Separateur
echo $separateur2."\r\n" ;

#Tableau 2
echo ($separateur.$Tableau2)."\r\n";
echo implode ($separateur,$entetes2)."\r\n";
$MoinsModifs -> execute(array());
While ( $donnees2=$MoinsModifs -> fetch()) # condition vérifant que les valeurs entrées sont conforment à celles de la bdd
{
// Création du contenu du tableau
$lignes2 []= array($donnees2["Titre"], $donnees2["DateModif"], $donnees2["Commentaire"], $donnees2["Contributeur"]);
}
foreach ($lignes2 as $ligne) {
echo implode ($separateur,$ligne)."\r\n";
}

#Separateur
echo $separateur2."\r\n" ;

#Tableau 3
echo ($separateur.$Tableau3)."\r\n";
echo implode ($separateur,$entetes3)."\r\n";
$PlusModifs -> execute(array());
While ( $donnees3=$PlusModifs -> fetch()) # condition vérifant que les valeurs entrées sont conforment à celles de la bdd
{
// Création du contenu du tableau
$lignes3 []= array($donnees3["Titre"], $donnees3["DateModif"], $donnees3["Commentaire"], $donnees3["Contributeur"]);
}
foreach ($lignes3 as $ligne) {
echo implode ($separateur,$ligne)."\r\n";
}

#Separateur
echo $separateur2."\r\n" ;

#Tableau 4
echo ($separateur.$Tableau4)."\r\n";
echo implode ($separateur,$entetes4)."\r\n";
$PlusVues -> execute(array());
While ( $donnees4=$PlusVues -> fetch()) # condition vérifant que les valeurs entrées sont conforment à celles de la bdd
{
// Création du contenu du tableau
$lignes4 []= array($donnees4["Titre"], $donnees4["NombreVues"]);
}
foreach ($lignes4 as $ligne) {
echo implode ($separateur,$ligne)."\r\n";
}

#Separateur
echo $separateur2."\r\n" ;

#Tableau 5
echo ($separateur.$Tableau5)."\r\n";
echo implode ($separateur,$entetes5)."\r\n";
$MoinsVues -> execute(array());
While ( $donnees5=$MoinsVues -> fetch()) # condition vérifant que les valeurs entrées sont conforment à celles de la bdd
{
// Création du contenu du tableau
$lignes5 []= array($donnees5["Titre"], $donnees5["NombreVues"]);
}
foreach ($lignes5 as $ligne) {
echo implode ($separateur,$ligne)."\r\n";
}
?>


Voila a quoi j'aimerai qu'il ressemble en format csv:



Voila le résultat sous Mac :( :


A voir également:

1 réponse

jordane45 Messages postés 38288 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 15 novembre 2024 4 703
18 mai 2018 à 14:19
Bonjour,

Pour les soucis d'encodage
https://forums.commentcamarche.net/forum/affich-37584944-php-html-caracteres-accentues-et-l-utf8

NB: Pour que le CSV soit correctement lu sous Excel ensuite, il faut utiliser UTF8 (avec BOM).

Pour générer un fichier csv
$csvFile = "/path/to/yourfile.csv";
$f = fopen($csvFile, "w");
fputs( $f, "\xEF\xBB\xBF" ); // pour le mettre UTF-8 BOM 
foreach ($array as $line) {
    fputcsv($f, $line); // ecriture du contenu dans le fichier
}

NB: Dans ton cas, la variable $array est un merge de tes variables $lignes1 , $lignes2 , $lignes3 , $lignes4 , $lignes5
https://www.php.net/manual/fr/function.array-merge.php


Et enfin...pour forcer le téléchargement :
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');
readfile($csvFile);

0