IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Export Excel et échappement [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 90
    Points : 48
    Points
    48
    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.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si tu as des \ dans ta base de données c'est que tu as echappé tes données deux fois.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    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.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pourrais-tu expliciter les problèmes de mise en forme que tu rencontres alors ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    comment fais-tu pour exporter tes données ?
    Un bout de code ?

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    Bonjour,
    voici un extrait (le tableau exporté contient près de 50 colonnes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    ?>

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    header('content-type: text/csv');

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    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 \).

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    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.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    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).

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    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).

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu peux alors remplacer les retours à la lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ligne= str_replace(trim($ligne), "\n", " ");
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    Bonjour,
    ça fonctionne quand je l'utilise ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Utilise fputcsv() elle se charge de protéger les chaines de caractère.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    Je ne connaissais pas cette fonction, j'ai donc procédé méthodiquement en suivant l'exemple ici.

    Mon code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  17. #17
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Enlève tes apostrophes autour des variables.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  18. #18
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    Mon fichier reste vide.

  19. #19
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 90
    Points : 48
    Points
    48
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CR] export Excel (plusieurs feuilles)
    Par kaiserben dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 21/11/2005, 15h03
  2. [PEAR][Spreadsheet] PHP/EXPORT EXCEL : nombre de formats de cellule différents !
    Par joe_le_mort dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 27/10/2005, 17h21
  3. Tableau dynamique, export excel
    Par ptitepunk dans le forum Access
    Réponses: 1
    Dernier message: 14/10/2005, 12h21
  4. Réponses: 5
    Dernier message: 29/09/2005, 13h55
  5. Export Excel
    Par jfn dans le forum Access
    Réponses: 5
    Dernier message: 15/11/2004, 01h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo