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

avec Java Discussion :

Java requête SQL quote antislash


Sujet :

avec Java

  1. #1
    Membre régulier Avatar de ritchie23
    Profil pro
    Inscrit en
    Août 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2008
    Messages : 122
    Points : 70
    Points
    70
    Par défaut Java requête SQL quote antislash
    Bonjour,

    sous Java, je cherche à faire un delete sur une base de données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String variable = "delete from table where id = ' " + variable_temporaire + " ' "
    Cela fonction très bien pour variable_temporaire classique.

    Par contre, si dans le nom de ma variable_temporaire, j'ai une ' (quote) : alors ca plante !! En effet, la requete SQL se perd dans le nombre de quote.

    J'ai donc essayé les lignes de code suivantes, mais sans résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    variable = variable .replace(" \' ", " \\\' ");
    ou
    variable = variable .replace(" \' ", " \\' ");
    ou
    variable = variable .replace(" ' ", " \\\' ");
    ou
    variable = variable .replace(" ' ", " \\' ");

    Une idée SVP ?

    Ritchie.



    PS : un autre message sur le forum un peu similaire mais ne répondant plus à mon besoin :
    http://www.developpez.net/forums/d60...g/#post3571150

  2. #2
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Tu y es presque, à mon avis il ne faut pas modifier variable, mais variable_temporaire uniquement. Et tu ne dois pas mettre d'espaces dans les String de replace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable_temporaire = variable_temporaire.replace("\'", "\\\'");

  3. #3
    Membre régulier Avatar de ritchie23
    Profil pro
    Inscrit en
    Août 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2008
    Messages : 122
    Points : 70
    Points
    70
    Par défaut
    Salut,

    Je n'avais pas mi d'espace dans mon code (juste sur le forum pour que ca soit plus lisible).
    Donc ca ne marche tjs pas.

    Moi, j'opterai pour la solution suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    variable_temporaire  = variable_temporaire.replace("'", "\\'");
    Si je trouve un quote, il faut que je le remplace par 2 antislash et un quote car SQL a besoin d'1 antislash et un quote et java a besoin de mettre un 2° antislash devant son 1°.

    Mais, c'est ko et je ne comprends pas pourquoi.
    Et je n'ai pas réellement de message d'erreur à part ceci :
    line 1:73: unexpected token: 13

    Merci à ceux qui essayent de m'aider et qui pourront m'aider.
    Ritchie.

  4. #4
    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,

    Citation Envoyé par ritchie23 Voir le message
    Je n'avais pas mi d'espace dans mon code (juste sur le forum pour que ca soit plus lisible).
    Non : un code lisible est un code bien indenté. en rajoutant des espaces là où il ne doit pas en avoir tu ne fait qu'apporter de la confusion !

    Le code publié devrait être un copier-coller pour être sûr de ne pas oublier quelque chose d'important !

    Citation Envoyé par ritchie23 Voir le message
    Moi, j'opterai pour la solution suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    variable_temporaire  = variable_temporaire.replace("'", "\\'");
    C'est strictement identique à la solution de CheryBen puisque l'anti-slash n'est pas obligatoire devant une simple quote dans une chaine...

    Citation Envoyé par ritchie23 Voir le message
    Mais, c'est ko et je ne comprends pas pourquoi.
    Et je n'ai pas réellement de message d'erreur à part ceci :
    line 1:73: unexpected token: 13
    Et pourquoi ne pas avoir donné le message de suite !!!???
    C'est apparemment une erreur de compilation... et pourtant le code que tu as donné compile parfaitement !

    Donnes ton code exact !
    Donnes les messages d"erreurs, et précises les lignes/caractères correspondant


    a++


    PS : Et plutôt que de chercher à remplacer les quotes, il est préférable de passer par des PreparedStatement...

  5. #5
    Membre régulier Avatar de ritchie23
    Profil pro
    Inscrit en
    Août 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2008
    Messages : 122
    Points : 70
    Points
    70
    Par défaut
    Merci AdiGuba pour tes remarques.
    J'en prends note.

    Donc voici le message d'erreur complet :
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    16:56:51,092 ERROR PARSER:33 - line 1:72: unexpected token: 13
    16:56:51,108 DEBUG ErrorCounter:28 - line 1:72: unexpected token: 13
    line 1:72: unexpected token: 13
    	at org.hibernate.hql.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:647)
    	at org.hibernate.hql.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2586)
    	at org.hibernate.hql.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2542)
    	at org.hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2413)
    	at org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2331)
    	at org.hibernate.hql.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2296)
    	at org.hibernate.hql.antlr.HqlBaseParser.expression(HqlBaseParser.java:2082)
    	at org.hibernate.hql.antlr.HqlBaseParser.logicalExpression(HqlBaseParser.java:1858)
    	at org.hibernate.hql.antlr.HqlBaseParser.whereClause(HqlBaseParser.java:454)
    	at org.hibernate.hql.antlr.HqlBaseParser.deleteStatement(HqlBaseParser.java:266)
    	at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:148)
    	at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:248)
    	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157)
    	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
    	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
    	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
    	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
    	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
    	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
    	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
    	at com.thales.sat.lsr.pratic.model.impl.DaoImpl.executeUpdate(DaoImpl.java:49)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:296)
    	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:198)
    	at $Proxy11.executeUpdate(Unknown Source)
    	at com.thales.sat.lsr.pratic.loader.impl.FileFilterImpl.filter(FileFilterImpl.java:105)
    	at com.thales.sat.lsr.pratic.loader.impl.LoaderImpl.load(LoaderImpl.java:25)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:296)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:177)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
    	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
    	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    	at $Proxy12.load(Unknown Source)
    	at com.thales.sat.lsr.pratic.loader.LoaderTest.test(LoaderTest.java:13)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at junit.framework.TestCase.runTest(TestCase.java:164)
    	at junit.framework.TestCase.runBare(TestCase.java:130)
    	at junit.framework.TestResult$1.protect(TestResult.java:110)
    	at junit.framework.TestResult.runProtected(TestResult.java:128)
    	at junit.framework.TestResult.run(TestResult.java:113)
    	at junit.framework.TestCase.run(TestCase.java:120)
    	at junit.framework.TestSuite.runTest(TestSuite.java:228)
    	at junit.framework.TestSuite.run(TestSuite.java:223)
    	at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:35)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
    16:56:51,108 DEBUG JDBCTransaction:152 - rollback
    16:56:51,123 DEBUG JDBCTransaction:193 - re-enabling autocommit
    16:56:51,123 DEBUG JDBCTransaction:163 - rolled back JDBC Connection

    Mon code exact :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Object fPurge = iteratorPurge.next(); // fPurge est un iterator reprenant tous les noms des chemins + fichiers d'accès.
    String stringFileIdBdd = fPurge.toString();
    stringFileIdBdd = stringFileIdBdd.replace("\\", "\\\\");
    stringFileIdBdd = stringFileIdBdd.replace("'", "\\'");
    String queryDeleteTicket = "delete from table1 where file_id = '"+ stringFileIdBdd + "'" ;
    int iPurgeTicket = dao.executeUpdate(queryDeleteTicket);

    Ritchie.

  6. #6
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Utilise un PreparedStatement ... c'est fait, entre autre, pour ce genre de trucs

    -> Les instructions paramétrées - PreparedStatement

    [EDIT] en plus comme ça à l'air d'être dans une boucle tu pourras utiliser le mode "batch" des PreparedStatement ...

    [EDIT 2] Ha je n'avais pas vu, adiGuba t'avais déjà donné l'info ... je me disais aussi ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  7. #7
    Membre régulier Avatar de ritchie23
    Profil pro
    Inscrit en
    Août 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2008
    Messages : 122
    Points : 70
    Points
    70
    Par défaut
    Je préfére ne pas utiliser les PrepareStatement, non seulement parce que je ne connais pas la Connexion.

    J'ai bien un résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stringFileIdBdd = stringFileIdBdd.replace("'", "%");
    Mais j'aurais préféré comprendre pourquoi mon code précédent ne fonctionne pas !!

    Ritchie.

  8. #8
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Heu juste en passant, pour échapper les quotes il me semble qu'il faille les doubler (sous Oracle tout du moins) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    stringFileIdBdd = stringFileIdBdd.replace("'", "''");
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  9. #9
    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
    Citation Envoyé par in Voir le message
    Heu juste en passant, pour échapper les quotes il me semble qu'il faille les doubler (sous Oracle tout du moins) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    stringFileIdBdd = stringFileIdBdd.replace("'", "''");
    +1

    Il me semble même que cela peut varier d'une BD à l'autre, et la meilleure solution reste donc d'utiliser les PreparedStatement !


    Ici l'erreur a lieu à l'exécution, et elle est remonté par la classe chargé d'exécuter la requête. Les remplacements doivent donc bien se faire mais la requête n'en est pas pour autant correcte vis à vis du SGBD...


    a++

  10. #10
    Membre régulier Avatar de ritchie23
    Profil pro
    Inscrit en
    Août 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2008
    Messages : 122
    Points : 70
    Points
    70
    Par défaut
    Nickel, ca marche !

    Il faut effectivement doubler les quotes.
    Et moi qui voulais travailler avec les antislash.

    Sinon, une petite astuce, qd on ne sait pas s'il faut doubler (ou quadrupler) les antislash, quotes ..., on peut mettre un %, ca marche très bien sous SQL (mais ca remplace plusieurs caractères et non pas un seul comme attendu.


    Merci encore !!

    Ritchie

  11. #11
    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
    Citation Envoyé par ritchie23 Voir le message
    Sinon, une petite astuce, qd on ne sait pas s'il faut doubler (ou quadrupler) les antislash, quotes ..., on peut mettre un %, ca marche très bien sous SQL (mais ca remplace plusieurs caractères et non pas un seul comme attendu.
    C'est du bricolage
    Et cela pourrait voir des effets indésirables... surtout sur un delete

    a++

  12. #12
    Membre régulier Avatar de ritchie23
    Profil pro
    Inscrit en
    Août 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2008
    Messages : 122
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Et cela pourrait voir des effets indésirables... surtout sur un delete
    Oui, en effet. Merci de la remarque.
    Donc c'est à bannir.

    Encore merci à tous.

    Ritchie.

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

Discussions similaires

  1. Requête SQL de base sous java avec Hibernate
    Par ritchie23 dans le forum JDBC
    Réponses: 0
    Dernier message: 29/10/2008, 09h54
  2. Requête SQL 'UPDATE' en Java
    Par Grulf dans le forum JDBC
    Réponses: 5
    Dernier message: 11/06/2008, 09h32
  3. copier une requête sql dans un code java
    Par Smix007 dans le forum Langage
    Réponses: 2
    Dernier message: 05/04/2008, 15h14
  4. [Requête/SQL]Pb de "quote" avec un type memo
    Par Tintou dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 26/04/2007, 15h47
  5. Réponses: 8
    Dernier message: 11/08/2006, 09h30

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