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

Langage Perl Discussion :

Probleme d'accent lors d'insertion de donnée dans 1 base Mysql venant d'1 fichier XML


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Probleme d'accent lors d'insertion de donnée dans 1 base Mysql venant d'1 fichier XML
    Bonjour,

    J'ai un petit souci lorsque je souhaite inserer dans ma base de donnée Mysql les données venant de fichier XML, les accents contenus dans les données sont transformé en é à etc.. ce qui est..... pas top

    Pour effectuer cela j'utilise DBI et XML::Simple

    et mon code est le suivant :

    my $xml = $xs->XMLin($fichierXML );
    my $piki=$xml->{'Job_Description'};

    my $strSQL = "UPDATE jobs SET advertreference = 'TEST_ADVERT',
    adverttextdescript = '$piki',
    WHERE jobsref = 28342
    ;";

    $dbh->do($strSQL);

    Mon fichier de test XML :
    <Customers>
    <Job_Description>ééééééàààààààààààààèèèèèè
    </Job_Description>
    </Customers>

    Les tests que j'ai deja fait montre que si je ne vais pas recuperer les données dans le fichier XML, je n'ai aucun souci d'accent, si je passe par une variable intermediaire, cela revient au meme, j'ai testé differents encode, decode, cela ne semble rien donné, j'ai toujours dans ma base de donnée a l'arrivé : ééééééà à à à à à à à à à à à à èèèèèè

    Par ailleurs mon phpmyadmin indique que le caractere set est en latin1.
    La configuration du serveur sur lequel je travaille est une Gentoo Linux avec mysql-4.0.25-r2 et perl 5.8.6

    Voila, je ne pense pas avoir oublié quelquechose... si ce n'est que je bute sur ce probleme depuis un certain temps, et qu'il commence a pu me rester beaucoup de cheveux, donc si vous pouvez sauvez mon coiffeur du chomage technique, ca serait avec grand plaisir

    Merci d avance

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Les données de ton XML doivent être en utf-8, fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    my $xml = $xs->XMLin($fichierXML );
    my $piki=$xml->{'Job_Description'};
    from_to($piki, 'utf-8', 'iso-8859-1' );
    my $strSQL = "UPDATE jobs SET advertreference = 'TEST_ADVERT',
    adverttextdescript = '$piki',
    WHERE jobsref = 28342
    ;";
     
    $dbh->do($strSQL);
    NB : L'encodage de ton XML devrait être précisé dans sa déclaration.

    --
    Jedaï

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse,

    malheureusement cela ne semble pas marché, le résultat obtenu par phpmyadmin est ?????????????????????????

    J'ajoute par ailleurs que les données sur le fichier XML a pour en tete :

    <?xml version="1.0" encoding="ISO-8859-1"?>

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ton fichier XML est-il réellement dans cet encodage, autrement dit, si tu ouvres ce fichier dans un éditeur et que tu dis à l'éditeur que l'encodage à utiliser est le latin1, le fichier reste-t-il lisible ? Par ailleurs comment ouvres-tu le fichier XML ? Comment te connectes-tu à la BDD ?

    --
    Jedaï

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'utilise ultraedit32 comme editeur et j'avoue ne pas savoir comment verifier l'encodage avec cette editeur, neamoins si tu sais le faire ou si tu en as un autre a me conseiller, ainsi que la methode pour verifier, je suis preneur..

    Concernant la seconde question :

    Pour ouvrir le fichier XML, sans option particuliere :
    my $fichierXML="./Advert_XML/simple.xml";
    my $xml = $xs->XMLin($fichierXML );

    Pour la connection a la base de donnée :
    my $dbh = DBI->connect('DBI:mysql:matable:localhost:3306', 'login','passwd' );

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Je sais comment faire avec Scite (qui absolument génial par ailleurs), il suffit d'ouvrir le fichier et de spécifier l'encodage dans lequel on veut le voir avec "Fille > Encoding > 8 bits".

    --
    Jedaï

  7. #7
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bonjour Jedai,

    Je viens de télécharger Scite et de tester :

    Lorsque j'ouvre le fichier, celui ci semble etre en 8 bit par défaut et le texte est nickel à l'affichage. Lorsque je lui demande de l'afficher en UTF8 les caractères accentués deviennnent illisible.

    Ce qui, si je me plante pas (ce qui n'est pas impossible vu que je nage un peu sur la question en ce moment ), signifie que mon fichier est bien en iso...

    Si quelqu'un a une bouée, pardon une idée?

  8. #8
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    je me permets de rajouter des informations en plus, bien que n'ayant toujours pas réussi a resoudre mon probleme

    Lorsque je récupere le contenu de $xml->{'Job_Description'} et que je l'écrit dans un fichier, celui ci produit bien des accents comme il faut (le code Hexxa est le meme)..

    Si quelqu'un a une piste ou une solution, je suis toujours preneur..

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    regarde le pod du module Encode

  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Ackasha
    je me permets de rajouter des informations en plus, bien que n'ayant toujours pas réussi a resoudre mon probleme

    Lorsque je récupere le contenu de $xml->{'Job_Description'} et que je l'écrit dans un fichier, celui ci produit bien des accents comme il faut (le code Hexxa est le meme)..

    Si quelqu'un a une piste ou une solution, je suis toujours preneur..
    Tu veux dire que si tu l'écris dans un fichier ça l'écrit en latin1 ? Dans ce cas le problème vient de la BDD ou de la connexion à celle-ci, pourrais-tu nous donner plus d'information de ce côté là ?

    --
    Jedaï

  11. #11
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'ai regardé du coté de la base de donnée, pour etre precis j'ai meme recréer une base avec une table avec un seul et unique champs de type texte , en modifiant a chaque fois les parametres :

    lorsque j'effectue une insertion de "ééé" venant d'une variable de mon fichier, je n'ai aucun probleme..

    lorsque je récupere le "ééé" d'un fichier XML avec XML::simple je retrouve dans ma base "ééé"....

    J'ai cherché au niveau des forums, des FAQ si par hasard il y aurait un bug de compatibilité au niveau de XML simple et mySQL, je n'ai rien trouvé....

  12. #12
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Je voudrais que tu fasses le test 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
     
    #! /usr/bin/perl
    use strict; use warnings;
    use Encode
     
    # ta connexion à une base de donnée test
     
    my $fichierXML = "ton fichier";
    my $xml = $xs->XMLin($fichierXML );
    my $piki=$xml->{'Job_Description'};
     
    my $pikiprim = "éééé"; #enfin ce qu'il devrait y avoir dans $piki
     
    {
      local $\ = "\n";
      local $, = ", ";
      print unpack('c*', $piki);
      print unpack('c*', $pikiprim);
      print Encode::is_utf8( $piki );
      print Encode::is_utf8( $pikiprim );
    }
     
    # tes requètes SQL pour faire entrer $piki et $pikiprim dans ta base de test
    Si toutes les sorties sont pareilles et qu'il y a une différence dans la base, on saura définitivement qu'il y a un fantôme dans ton ordi et qu'il faut que tu fasses appel à un exorciste plutôt qu'à nous...

    --
    Jedaï

  13. #13
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'ai donc effectué les changements tels que tu le décris et de plusieurs facon, et avec des résultats différents :

    J'insere le code que tu as décris et j'obtiens toujours la meme chose a affichage:

    printf ("====================\n");
    print unpack('c*', $piki);
    print unpack('c*', $pikiprim);
    printf ("====================\n");
    print Encode::is_utf8( $piki );
    print Encode::is_utf8( $pikiprim );
    printf ("====================\n");

    donne :

    ====================
    -61, -87, -61, -87, -61, -87, -61, -87, -61, -87, -61, -87, -61, -96, -61, -96, -61, -96, -61, -96, -61, -96, -61, -96, -61, -96, -61, -96, -61, -96, -61, -96, -61, -96, -61, -96, -61, -96, -61, -88, -61, -88, -61, -88, -61, -88, -61, -88, -61, -88, 10
    -23, -23, -23, -23
    ====================
    1

    ====================
    Dans un premier temps au niveau des requetes SQL j'avais écris la chose suivante :

    my $strSQL = "UPDATE jobs SET advertreference = 'TEST_ADVERT',
    adverttextdescript = '$piki',
    advertprofil = '$pikiprim'
    WHERE jobsref = 28342
    ;";
    $dbh->do($strSQL);

    qui dans la base de donnée me donne :
    adverttextdescript : ééééééà à à à à à à à à à à à Ã
    advertprofil : éééé

    puis par la suite j'ai changé la forme de ma requete en :
    my $strSQL = "UPDATE jobs SET advertreference = 'TEST_ADVERT',
    adverttextdescript = ?,
    advertprofil = ?
    WHERE jobsref = 28342
    ;";

    my $sth = $dbh->prepare($strSQL);
    $sth->execute($piki,$pikiprim);

    ceci me donnant le meme résultat a l'écran et par contre dans la base de donnée on obtient :
    adverttextdescript : ééééééà à à à à à à à à à à à Ã
    advertprofil : éééé

    ce qui est légérement mieux que précédemment, mais qui n'arrange pas mes affaires...

  14. #14
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Utilise les balises code par pitié ! Là c'est illisible...
    Néanmoins je constate que $piki est bien de l'utf8 et marqué comme tel, donc le code suivant devrait faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    my $strSQL = "UPDATE jobs SET advertreference = 'TEST_ADVERT',
    adverttextdescript = ?,
    advertprofil = ?
    WHERE jobsref = 28342
    ;";
     
    utf8::downgrade($piki);
     
    my $sth = $dbh->prepare($strSQL);
    $sth->execute($piki,$pikiprim);
    Si ça ne marche pas, essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    use Encode qw(_utf8_off from_to);
     
    my $strSQL = "UPDATE jobs SET advertreference = 'TEST_ADVERT',
    adverttextdescript = ?,
    advertprofil = ?
    WHERE jobsref = 28342
    ;";
     
    _utf8_off($piki);
    from_to($piki, "utf8", "iso-8859-1");
     
    my $sth = $dbh->prepare($strSQL);
    $sth->execute($piki,$pikiprim);
    --
    Jedaï

  15. #15
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Un grand merci a toi, cela semble fonctionné...

    je viens de faire les modifications pour l'insert et après quelques ajustements au niveau de la requetes afin de faire des prepare et execute et non plus une requete brute transmise, j'ai enfin des accents dans ma base de donnée en faisant un downgrade utf8::downgrade($piki)


    encore merci

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

Discussions similaires

  1. [MySQL] Insertion de données dans une base MySQL via un formulaire
    Par rcomlan dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 09/02/2015, 19h53
  2. Insertion de données dans une base MySQL
    Par arm3366 dans le forum SGBD
    Réponses: 4
    Dernier message: 26/02/2013, 09h46
  3. [MySQL] Problème d'insertion de données dans une base MySql à partir d'un fichier csv
    Par kazabandi dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 22/12/2010, 18h05
  4. Insertion de donnée dans une base MySql
    Par jep33 dans le forum Langage
    Réponses: 4
    Dernier message: 05/11/2008, 07h44
  5. Réponses: 3
    Dernier message: 27/03/2006, 17h25

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