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

 Delphi Discussion :

Delphi plante quand un utilisateur met des simple ou double quote dans un champ texte


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 39
    Points
    39
    Par défaut Delphi plante quand un utilisateur met des simple ou double quote dans un champ texte
    Bonjour à tous

    Je reviens vous voir pour vous poser une question concernant un problème que je rencontre avec Delphi 7 et la base de données Firebird 2.0.3 (la base importe peu dans mon cas).

    J'ai crée un programme avec différents champs (donnée d'un client). Le problème est que lorsque l'utilisateur place des simple ou double quote, le programme plante à cause d'un mauvais échappement au niveau de la requête SQL.
    Exemple : o'brian ou 3"5 (je sais ce cas ne se présentera pas mais on sait jamais...).

    Voici mon bout de code pour vous montrer comment j'ai voulu régler le problème mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    requete := Format('INSERT INTO CLIENT (prenom_client, nom_client, adresse_client, cp_client, ville_client, pays_client) VALUES (%s, ''test'', ''test'', '+txt_cp_client.Text+', ''test'', ''test'')', [QuotedStr(txt_prenom_client.Text)]);
    UIBQuery.SQL.Add(requete);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    requete := 'INSERT INTO CLIENT (prenom_client, nom_client, adresse_client, cp_client, ville_client, pays_client) VALUES ('''+txt_prenom_client.Text+''', ''test'', ''test'', '+txt_cp_client.Text+', ''test'', ''test'')');
    UIBQuery.SQL.Add(requete);
    J'aimerai que quelqu'un me donne une marche à suivre ou m'aide pour régler ce problème.

    Merci beaucoup de m'avoir lu

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    Je ne connais pas Firebird , mais je te dirais
    qu'il faut que tu passes soit par des paramètres, soit une fonction qui de double tes côtes, avant d'insérer ton champ.

    A+

  3. #3
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par pitango Voir le message
    Je ne connais pas Firebird , mais je te dirais
    qu'il faut que tu passes soit par des paramètres, soit une fonction qui de double tes côtes, avant d'insérer ton champ.
    +1
    c'est exactement mon avis.

    @+

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Merci de vos réponses, je vais de ce pas m'atteler à me tourner vers vos réponses.

    Par hasard, auriez-vous un bout de code pour me montrer ce que cela donne ?

    Parametres = UIBDataSet ?

    Merci !

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 037
    Points
    7 037
    Par défaut
    QuotedStr ne sert pas à ça ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Bah je ne sais pas mais avec le quotedstr, ça me fait tout de même des erreurs...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    C'est parce que quotedstr ne fait qu'encadrer ta chaine.

    Dans ton cas, après la concaténation, ta requête contiendra toujours des simple quote (o'brian), et c'est ton SGBD qui bloquera au premier '.

    A+

  8. #8
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Non en principe QuotedStr va bien doubler les ' à l'intérieur de la chaîne.
    Peux-tu nous montrer le résultat de QuotedStr, ainsi que de SQL.Text ?

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par sjrd Voir le message
    Non en principe QuotedStr va bien doubler les ' à l'intérieur de la chaîne.
    Non pas du tout, j'en ai fait les frais. Il faut bien soit implémenter une fonction qui va doubler les ' ou - ce qui est nettement plus simple - utiliser des paramètres.

    C'est la 1° fois que j'arrive à te contredire, je suis tout penaud.

    @+ Claudius

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Citation Envoyé par Cl@udius
    j'en ai fait les frais
    moi aussi.

    A+

  11. #11
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 037
    Points
    7 037
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Non pas du tout, j'en ai fait les frais. Il faut bien soit implémenter une fonction qui va doubler les ' ou - ce qui est nettement plus simple - utiliser des paramètres.
    Exact !
    Je me suis déjà fait avoir aussi.
    (m'en souvenais plus)

  12. #12
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Dans quel cas QuotedStr ne fonctionne-t-il pas? Cela m'intéresse.

    Je l'utilise pour mes requetes et je n'ai aucun souci.

    J'utilise Delphi 7 et Oracle

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Dans quel cas QuotedStr ne fonctionne-t-il pas? Cela m'intéresse.

    Je l'utilise pour mes requetes et je n'ai aucun souci.

    J'utilise Delphi 7 et Oracle
    Certainement quand il y a un peu trop de simple quote.

    Mais j'ai abandonné l'utilisation du quotedStr, j'ai trouver après plusieurs heures de recherche et c'est carrément mieux que ce QuotedStr.

    Merci beaucoup de vos réponses !

    @bientôt

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Citation Envoyé par Linkin
    Dans quel cas QuotedStr ne fonctionne-t-il pas?
    Je parle pour SQLserver. Si tu procède par concaténation et que tu as une requête de ce genre

    ma_requete:='select champ1 from table1 where champ2 = '+valeur_str;

    où valeur_str est un string.

    Pour que cea fonctionne tu devras encadrer ta chaine par des quotes.
    tu as alors deux solutions
    ma_requete:='select champ1 from table1 where champ2 = '+quoted(valeur_str);
    ou.
    ma_requete:='select champ1 from table1 where champ2 = '''+valeur_str+'''';

    Mais si ta chaine valeur_str possède un quote à l'intérieur ,
    tu devras doubler tes quotes dans ta chaine où utiliser une requête paramétré.

    A+

  15. #15
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Ok je testerais ça sous SQL Server, je n'ai pas ces problèmes avec Oracle

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

Discussions similaires

  1. [XL-2010] Problème de modification quand il y'a des noms en double
    Par foular dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 20/04/2015, 17h21
  2. [RegEx] Simple ou double quote dans une expression régulière
    Par Khleo dans le forum Langage
    Réponses: 2
    Dernier message: 27/12/2010, 15h58
  3. simple ou double quote
    Par Jasmine80 dans le forum Installation
    Réponses: 15
    Dernier message: 14/12/2006, 12h02
  4. Placer des quote dans un champs
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 21/04/2005, 10h36
  5. Réponses: 4
    Dernier message: 05/07/2004, 13h17

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