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

JDBC Java Discussion :

[JDBC] Préparer une chaîne pour envoi à MySQL


Sujet :

JDBC Java

  1. #1
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut [JDBC] Préparer une chaîne pour envoi à MySQL
    Hello,

    Dans mon projet d'application de gestion en java, j'ai, à de nombreux endroits, des chaînes de caractères, encodées par l'utilisateur, qui sont envoyées et stockées dans une base de donnée MySQL.

    Dans le but de faire face à tout encodage de caractères spéciaux par l'utilisateur, j'ai cherché à faire une classe contenant une méthode qui me transforme les chaînes contenant des ' , des \ et des " avec un backslash devant : exemple : L'ombre devient L\'ombre.

    J'ai réussi à écrire ceci qui fonctionne très bien :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    import java.util.*;
     
    public class StringMySQLConverter
    {
    public String chaineAConvertir;
    //******************************************************************
    public StringMySQLConverter(String chaineAConv )
      {
      chaineAConvertir = chaineAConv;
      }
    //******************************************************************
    public String adapterPourMySQL()
      {
      char [] mot;  mot = chaineAConvertir.toCharArray();
     
      Vector leMot = new Vector();
     
      for( int i=0; i<mot.length; i++)
                      leMot.add( ""+mot[i] );
     
      Vector nouvMot = new Vector();   int j=0;
     
      for (int i=0; i<leMot.size(); i++)
        {
        if (  ((String)leMot.elementAt(i)).equals("\'") )
             {
             nouvMot.insertElementAt("\\",j);
             j++;
             nouvMot.insertElementAt( (String)leMot.elementAt(i) , j);
             }
        else if (  ((String)leMot.elementAt(i)).equals("\\") )
                  {
                  nouvMot.insertElementAt("\\",j);
                  j++;
                  nouvMot.insertElementAt( (String)leMot.elementAt(i) , j);
                  }
             else if (  ((String)leMot.elementAt(i)).equals("\"") )
                       {
                       nouvMot.insertElementAt("\\",j);
                       j++;
                       nouvMot.insertElementAt( (String)leMot.elementAt(i) , j);
                       }
                  else {
                       nouvMot.insertElementAt( (String)leMot.elementAt(i) , j);
                       }
        j++;
        }
     
      StringBuffer chaineARenvoyer = new StringBuffer();
     
      for (int h=0; h<nouvMot.size(); h++)
                    chaineARenvoyer.append( (String)nouvMot.elementAt(h) );
     
      return chaineARenvoyer.toString();
      }
    //******************************************************************
    }
    Ce qui donne un appel de la sorte dans le programme qui l'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaineAEnvoyer = (new StringMySQLConverter(texteEncodé)).adapterPourMySQL() ;
    Mais je me demande s'il n'y a pas moyen de faire plus léger ou plus beau et concis dans l'écriture...
    Quelqu'un a une autre idée à me donner pour faire en plus simple cette préparation de chaîne ?

    [ Modéré par Bulbo ]
    Ajout d'un tag dans le titre
    Les Règles du Forum

  2. #2
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    L'idée me semble bonne ! Par contre, pourquoi ne pas utiliser la méthode replaceAll(String, String) au lieu du insertAt, pour gagnner quelques lignes de code.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    Pour remplacer des characteres dans une chaine, c'est clair que tu n'as pas d'autres methodes que de regarder dans ton String... Par contre, il est clair que la suggestion de big_mouth_fish est pertinente, en convertissant ton char[] en String, et en faisant des replaceAll sur les characteres qui t'embetent, tu t'evites quelques transformations et quelques boucles... Tu auras un code plus concis, plus clair, et probablement plus efficace, tu vas eviter de faire 3 boucles a chaque fois...

  4. #4
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Je ne suis pas si sûr de l'intérêt d'utiliser replaceAll(String, String).

    Car quand je fais le premier remplacement de mon caractère ' par \'
    lorsque je vais ensuite remplacer les \ par des \\, la fonction ci-dessus
    me transformera mes \' (qui sont OK) en \\'.

    Je pense donc qu'il vaut mieux finalement faire comme je l'ai fait:
    traiter la chaine caractère par caractère, et ainsi respecter la suite des caractères de la chaine originale...

    En tous cas, merci à vous deux de vous être penché sur le cas !
    ;-)

  5. #5
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    Et non pas forcément. Il suffit de le faire dans le bon ordre :
    Il faut commencer par faire un replace des \
    Et ensuite remplacer les autres caractères spéciaux.

  6. #6
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Oui, en effet.

    Je vais maintenant faire un test de ré-écriture de cette classe, en espérant réduire sa taille du point de vue "nbre de routines", car pour un grand nombre de données à sauver, cela peut être une cause de ralentissement...
    ;-)

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu pourrais utiliser la syntaxe d'échappement :
    FAQ : Qu'est-ce que la syntaxe d'échappement ?


    Voir même utiliser des preparedStamenent :
    FAQ : Les instructions paramétrées - PreparedStatement

    a++

  8. #8
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Les Prepared Statements gèrent les caractères spéciaux, en fonction du SGBDR choisi, c'est ça !!??

    OK, super !! Je commence alors à comprendre leur raison d'exister... Car dans mon projet, je fais de simples statement en construisant mes requêtes bout par bout, mais je dois alors gérer moi-même les caractères spéciaux...

    Du coup, si les Prepared Statement le font à ma place, je commence à trouver cela intéressant !!
    ;-)

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/10/2014, 23h56
  2. [XCode] Déclencher une Copie d'écran pour envoi par mail
    Par macbidule dans le forum XCode
    Réponses: 4
    Dernier message: 08/05/2012, 16h31
  3. créer une interface utilisateur console pour requetes sur mysql
    Par begonia dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/03/2007, 15h16
  4. Réponses: 2
    Dernier message: 12/01/2005, 23h08
  5. Réponses: 13
    Dernier message: 10/05/2004, 16h49

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