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 :

[DEBUTANT] Substitution de caractère pour insertion ds mysql


Sujet :

JDBC Java

  1. #1
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut [DEBUTANT] Substitution de caractère pour insertion ds mysql
    Bonjour,

    Je cherche à insérer des chemins de fichiers dans une base de données, or lorsque j'ai essayé d'insérer les données les caractères \ n'apparaissaient pas , aussi je procède à un remplacement des caractères \ par \\ afin qu'ils soient prit en compte dans la base mysql.

    Je procède comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String sql = "insert into fichiers (path,filename) values ('"+repertoire.getParent().replaceAll("\\","\\\\")+"','"+repertoire.getName()+"')";
    Mais j'ai l'erreur suivante lorsque je catche l'exception :

    java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
    \
    ^

    C'est quoi le pb ?

  2. #2
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Bonjour,

    public String replaceAll(String regex,
    String replacement)Replaces each substring of this string that matches the given regular expression with the given replacement.
    An invocation of this method of the form str.replaceAll(regex, repl) yields exactly the same result as the expression
    Le premier argument doit être une expression régulière.
    A mon avis, "\\" ne doit pas être une expression régulière.
    (C'est juste un début de réponse, documente toi sur les expressions régulières).

    bon courage

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    hello,
    Probleme de pattern,essai comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String sql = "insert into fichiers (path,filename) values ('"+repertoire.getParent().replaceAll("\\\\","\\\\\\\\")+"','"+repertoire.getName()+"')";
    En gros faut proteger les char qui protege.

  4. #4
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Le premier argument doit être une expression régulière.
    A mon avis, "\\" ne doit pas être une expression régulière.
    Dans la doc des expressions régulières \\ représente le backslash.

    String sql = "insert into fichiers (path,filename) values ('"+repertoire.getParent().replaceAll("\\\\","\\\\\\\\")+"','"+repertoire.getName()+"')";

    En gros faut proteger les char qui protege.
    Je n'avais pas compris le coup des char qui protege mais merci ça fonctionne mes champs en base contienne le caractère \

    Cependant une question, pour insérer le caractère \en base mysql , est ce que je procède de la bonne manière ?

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Pour faire plus simple et plus propre essaye avec un PreparedStatement au lieu d'un Statement de base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PreparedStatement stp = cnx.prepareStatement("insert into fichiers (path,filename) values (?,?)");
    stm.setString(1,repertoire.getParent());
    stm.setString(2,repertoire.getName());
     
    stm.executeUpdate();

  6. #6
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Et pour ce qui est de la substitution des caractères \ , pas mieux que ce qui est proposé plus haut ?

    Merci

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Aucune substitution n'est nécessaire avec les PreparesStatement, c'est la méthode setString() qui se charge de doubler les caractère \ et ' et ajoute seule les cotes autour de ta chaine.

  8. #8
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    C'est cool ça fonctionne très bien !!!

    Pour des insertions ou update c'est toujours les prepared statements qu'il faut utiliser ?

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Par principe, pour toutes les requetes avec des paramètres.
    Je l'utilise aussi pour les requetes sans paramètre mais à usage fréquente.

    En effet, lors d'un preparedStatement, la base calcul le plan de la requete et le conserve en cache ce qui évite d'avoir à reférifier syntaxiquement et à rechercher la meilleur stratégie d'accès.

    ps: Même si tu n'utilise pas de PreparedStatement, la base est tout de même obligée de calculer un plan et de vérifier la syntaxe. Le surcout pour la base n'est pas si énorme que celà car le cache est valable pour tous les utilisateurs connectés à celle-ci.

    Un petit tag résolu ?

  10. #10
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Ok je te remercie bien de ton aide !!!

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

Discussions similaires

  1. Lecture fichier pour INSERT dans MySQL
    Par mitchreward dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 20/02/2014, 01h39
  2. String to Date pour insertion sur MySQL
    Par kaymos dans le forum Langage
    Réponses: 10
    Dernier message: 11/02/2010, 17h06
  3. DEBUTANT - Aide pour une requête MYSQL
    Par kryogen dans le forum Langage SQL
    Réponses: 9
    Dernier message: 23/03/2007, 15h30
  4. changer jeu de caractères pour MySQL
    Par gforce dans le forum Installation
    Réponses: 13
    Dernier message: 13/12/2006, 23h23
  5. Réponses: 1
    Dernier message: 07/08/2006, 11h22

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