Précédent   Forum du club des développeurs et IT Pro > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/12/2012, 10h30   #1
Allegro
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 84
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 84
Points : 18
Points : 18
Par défaut Export Excel et échappement

Bonjour à tous,
j'exporte dans une feuille Excel différentes données issues de ma BD. Certaines sont des chaînes de caractères pouvant contenir des caractères spéciaux (des ' notamment). Je les gère actuellement à l'aide de la fonction mysql_real_escape_string. Cependant j'aimerai ne plus avoir dans mes cellules les antislashs dûs à l'échappement.
Existe-il une autre fonction ou une autre méthode que je pourrai appliquer?

D'avance, merci.
Allegro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 11h41   #2
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 478
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 478
Points : 21 292
Points : 21 292
Si tu as des \ dans ta base de données c'est que tu as echappé tes données deux fois.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 14h23   #3
Allegro
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 84
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 84
Points : 18
Points : 18
Non je n'ai pas de \ dans ma BD, ils sont présents sur la feuille Excel une fois exportée.
Si je transfère directement ces données sur la feuille, j'ai un problème de mise en forme (passages à la lignes...) que je n'ai pas en utilisant mysql_real_escape_string.
En revanche mes cellules contiennent des \ devant chaque ' par exemple, ce que je voudrai supprimer.
Allegro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 15h11   #4
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 478
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 478
Points : 21 292
Points : 21 292
Pourrais-tu expliciter les problèmes de mise en forme que tu rencontres alors ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 09h44   #5
Allegro
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 84
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 84
Points : 18
Points : 18
Comme dis dans le précédent post, si je n'utilise pas mysql_real_escape_string j'ai des passages à la ligne non voulus dans mon fichier Excel : le contenu de certaines celulles finit à la ligne suivante :
au lieu d'avoir un tableau de ce style :
Code :
1
2
3
4
5
    A   B  C 
1  A1 B1 C1
2  A2 B2 C2
3  A3 B3 C3
4  A4 B4 C4
J'ai :
Code :
1
2
3
4
5
6
   A  B  C
1 A1 B1 C1
2 A2 B2
3 B2 C2
4 A3 B3 C3
5 A4 B4 C4
J'espère que c'est un peu plus clair...
Allegro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 10h11   #6
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 588
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 588
Points : 6 046
Points : 6 046
Envoyer un message via Skype™ à rawsrc
Salut,

comment fais-tu pour exporter tes données ?
Un bout de code ?
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 12h03   #7
Allegro
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 84
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 84
Points : 18
Points : 18
Bonjour,
voici un extrait (le tableau exporté contient près de 50 colonnes) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
// Ouverture de session
session_start();
 
// Récupération du tableau
$tabid=$_SESSION['id'];
 
// Transformation du tableau 
$listeid = "'".implode("', '", array_map('mysql_real_escape_string', $tabid))."'";
 
header("Content-type:application/vnd.ms-excel");
header("Content-disposition:attachment;filename=ExportProjet.xls");
 
//connexion à la base de données
include("connectionBD.php");
 
// requête sur la base de données  
$requete="SELECT id, a, b, c, ... FROM table WHERE id IN ({$listeid})";
$resultat=mysql_query($requete) or die ('ERREUR'.mysql_error());
 
// création de la chaine de caractere à exporter 
// initialisation de la chaine
$excel=" ";
// Entetes
$excel .="ID \t A \t B \t C \t ... \n";
// Contenu
while ($ligne=mysql_fetch_assoc($resultat))
	{
// Récupération des résultats de la requete et rangement dans variables
$id=$ligne["id"];
$a=mysql_real_escape_string($ligne["a"]);
$b=mysql_real_escape_string($ligne["b"]);
$c=mysql_real_escape_string($ligne["c"]);
...
// Ajout des données dans la chaine 
$excel .="$id \t $a \t $b \t $c \t ... \n";
}
// execution
print$excel;
exit;
 
// Fermeture de la session
session_destroy();
?>
Allegro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 13h07   #8
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 588
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 588
Points : 6 046
Points : 6 046
Envoyer un message via Skype™ à rawsrc
euh, tu n'utilises aucune librairie tierce pour générer un fichier excel valide ?
Ce que tu envoies c'est du csv avec la tabulation pour séparateur et comme tu peux t'en douter c'est assez différent du format Excel.

Au lieu de mettre le header sur excel, essaies en le remplaçant par
Code :
header('content-type: text/csv');
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/01/2013, 13h22   #9
Allegro
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 84
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 84
Points : 18
Points : 18
oui c'était bien un csv et non un excel.

J'ai changé la ligne concernée mais j'ai toujours ce problème d'escape :
- avec j'ai des \ devant mes '
- sans j'ai un fichier plein d'erreurs

Pour la librairie ce n'est peut-être pas nécessaire puisque le format csv me convient mais je voudrai des cellules propres (sans les \).
Allegro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 13h42   #10
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 478
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 478
Points : 21 292
Points : 21 292
Une chose sûre c'est que mysql_real_escape_string n'est pas la fonction adaptée pour des données provenant d'une requête.
Il faudrait que tu ouvres le CSV obtenu avec un editeur de texte pour voir exactement ce qui est produit.

Utilise le point-virgule comme séparateur, c'est le séparateur reconnu par défaut sur Excel en français.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 13h56   #11
Allegro
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 84
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 84
Points : 18
Points : 18
Le problème est qu'il interprête les ' ou certains espaces (comme des nombres écrit comme ça : x xxx) comme fin de lignes. Je trouve donc la fin du contenu de ma cellule dans la première cellule de la ligne suivante et les cellules qui suivaient dans les cellules suivantes (est-ce clair?).

J'ai changé les /t par des ; et je me retrouve avec toute la ligne dans la première cellule (les ; séparant les différents champs).
Allegro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 16h26   #12
Allegro
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 84
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 84
Points : 18
Points : 18
Re-bonjour,
J'ai peut-être un début d'explication : Les retours à la lignes se produisent en fait lorsqu'il y a un retour à la ligne dans la cellule (Les données proviennent à la base d'un fichier Excel que j'ai importé sur MySQL).

Exemple :
- Lorsque ma cellule contient le texte :
"bravo alberto, c'est bien"
aucun problème

- Lorsque ma cellule contient le texte :
"bravo alberto
c'est bien"
La je trouve le "bravo alberto" à sa place dans la bonne cellule et le "c'est bien" dans la première cellule de la ligne suivante.

Quand j'utilise mysql_real_escape_string, j'ai "bravo alberto\nc\'est bien" et je voudrai "bravo alberto, c'est bien".

J'espère avoir été un peu plus clair avec cet exemple. Je vous ai peut-être induit en erreur avec mes ' qui n'étaient pas le problème (a priori).
Allegro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 17h40   #13
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 478
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 478
Points : 21 292
Points : 21 292
Tu peux alors remplacer les retours à la lignes :
Code :
$ligne= str_replace(trim($ligne), "\n", " ");
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/01/2013, 09h40   #14
Allegro
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 84
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 84
Points : 18
Points : 18
Bonjour,
ça fonctionne quand je l'utilise ainsi :
Code :
$ligne=str_ireplace("\n"," ",trim($ligne));
Par contre j'ai toujours le problème sur quelques cellules.
J'ai remarqué que ces cellules ont en commun de :
- soit contenir un nombre suivi d'un retour à la ligne
exemple1 :
"bravo 12.45
alberto"
=> alberto se retrouve dans la première cellule de la ligne suivante

- soit contenir un point ou une virgule, précédé d'un nombre et suivi d'un retour à la ligne
exemple2 :
" bravo 12.45.
alberto"
=> pareil
Allegro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 09h53   #15
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 478
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 478
Points : 21 292
Points : 21 292
Utilise fputcsv() elle se charge de protéger les chaines de caractère.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 10h31   #16
Allegro
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 84
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 84
Points : 18
Points : 18
Je ne connaissais pas cette fonction, j'ai donc procédé méthodiquement en suivant l'exemple ici.

Mon code est le suivant:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
// Ouverture de session
session_start();
 
// Récupération du tableau
$tabid=$_SESSION['id'];
 
// Transformation du tableau
$listeid = "'".implode("', '", array_map('mysql_real_escape_string', $tabid))."'";
 
header("content-type: text/csv");
header("Content-disposition:attachment;filename=ExportProjet.csv");
 
//connexion à la base de données
include("connectionBD.php");
 
// requête sur la base de données  
$requete="SELECT id, a, b, c, ... FROM table WHERE id IN ({$listeid})";
$resultat=mysql_query($requete) or die ('ERREUR'.mysql_error());
 
$fp=fopen('ExportProjet.csv','w');
 
$tab=array();
$tab=array('id','a','b','c',...);
 
while ($ligne=mysql_fetch_assoc($resultat))
	{
// Récupération des résultats de la requete et rangement dans variables
$id=$ligne["id"];
$a=str_ireplace("\n"," ",trim($ligne["a"]));
$b=str_ireplace("\n"," ",trim($ligne["b"]));
$c=str_ireplace("\n"," ",trim($ligne["c"]));
...
$tab=array('$id','$a','$b',...);
fputcsv($fp,$tab);
}
 
// execution
fclose($fp);
 
// Fermeture de la session
session_destroy();
?>
Mais ce code ne fonctionne pas, le fichier reste vide.
Allegro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 10h41   #17
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 478
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 478
Points : 21 292
Points : 21 292
Enlève tes apostrophes autour des variables.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/01/2013, 10h55   #18
Allegro
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 84
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 84
Points : 18
Points : 18
Mon fichier reste vide.
Allegro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 11h26   #19
Allegro
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2012
Messages : 84
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2012
Messages : 84
Points : 18
Points : 18
Bon je suis revenu à la première méthode qui fonctionnait presque. J'ai modifié manuellement les cellules qui posaient problème je vais ajouter le str_ireplace sur les nouvelles saisies.

Merci à sabotage et rawsrc pour leur précieuse aide et leur temps.

Sujet résolu
Allegro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h50.


 
 
 
 
Partenaires

Hébergement Web