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

Coldfusion Discussion :

Double quote qui viennent de nulle part


Sujet :

Coldfusion

  1. #1
    Membre habitué Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 367
    Points : 191
    Points
    191
    Par défaut Double quote qui viennent de nulle part
    Salut

    Je suis en train dedévelopper un site en CF (bien entendu, sinon je posterai pas ici) qui utilise une requette, mais j'ai un gros problème de quote qui se transforme en double quote

    Voilà une partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <cfset une_variable = "NULL">
    
    <cfif une_condition>
      <cfset une_variable = "'une valeur'"> <!--- Remarquez le " puis le ' --->
    </cfif>
    
    <cfquery name="ma_query" datasource="ma_source">
      INSERT INTO MA_TABLE (UNE_COLONE_DE_TYPE_VARCHAR)
                 VALUES (#une_variable#)
    </cfquery>
    Si la condition est validée dans ce cas, j'ai :
    [Macromedia][SQLServer JDBC Driver][SQLServer]Ligne 14 : syntaxe incorrecte vers 'une valeur'
    ...
    SQL : INSERT INTO MA_TABLE(UNE_COLONE_DE_TYPE_VARCHAR) VALUES (''une valeur'')
    Il s'agit bien de 2 apostrophes entre les parenthèses et non pas des guillements

    Alors j'ai tenté la même chose en supprimant l'apostrophe du cfset (pour avoir <cfset une_variable = "une valeur">

    et dans ce cas j'ai :
    [Macromedia][SQLServer JDBC Driver][SQLServer]Ligne 14 : syntaxe incorrecte vers 'une valeur'
    ...
    SQL : INSERT INTO MA_TABLE(UNE_COLONE_DE_TYPE_VARCHAR) VALUES (une valeur)
    Comment ca se fait que Coldfusion me double ces apostrophes ? Quelqu'un a une solution ? parce que je dois pouvoir mettre NULL ou une valeur dans les colones...

    Edit : Je rajoute en plus le fait que <cfset une_variable = "'une valeur avec l''apostrophe dedans'"> ne me double pas la double quote déjà existante

    PS : Faudrait que j'arrete de jongler avec les mots apostrophes et quotes

    Re encore edit :
    Coldfusion double les quotes simples, mais pas les doubles, même au milieu de la variable

    Si on en met 3 d'affilé, il en sort 4, mais si on en met 4, il en laisse 4

    En gros :
    ' devient ''
    '' reste ''
    ''' devient ''''
    '''' reste ''''
    et ainsi de suite....

    Du coup, je sais pas comment faire pour avoir une valleur "NULL" une chaine vide "''" ou une valeur "'toto'"

  2. #2
    Membre habitué Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 367
    Points : 191
    Points
    191
    Par défaut
    J'ai trouvé une solution qui n'est pas super à mon goût mais qui a le mérite de fonctionner...

    Elle est pas super parce que à mon avis, quelqu'un qui va arriver derrière moi va se demander pourquoi j'ai mis ce bout de code en plein milieu, en plus dans certains cas, il me semble que ca ne pourrait pas fonctionner (même si je ne voit pas comment on pourrait y arriver, mais je vous en parlerai plus loin)

    donc voici ma solution et ses explications (qui, soit dit en passant me laissent perplexe)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <cfset une_variable = "NULL">
    
    <cfif une_condition>
      <cfset une_variable = "'une valeur'"> <!--- 12 caractères --->
    </cfif>
    
    <cfquery name="ma_query" datasource="ma_source">
      INSERT INTO MA_TABLE (UNE_COLONE_DE_TYPE_VARCHAR)
                  VALUES (#Mid(une_variable, 2, len(une variable))#)
    </cfquery>
    Ce que je veux : Tout les caractères de la chaine de caractère, sauf le premier et le dernier
    Ma démarche : Je prends tout les caractères de la chaine, à partir du deuxième, et jusqu'à l'avant dernier
    C'est à dire : la sous chaine de caractère partant du deuxième caractère, d'une longueur de la taille de la chaine de caractère - 2 (qui est le nombre de caractères)
    Retranscrit en coldfusion ca donne
    "La sous chaine de caractère" = "MID(une_variable, "
    "En partant du deuxième caractère" = "2, "
    "Et de la taille de la chaine de caractère - 2" = "LEN(une_variable) - 2)"
    soit écrit en une fois : MID(une_variable, 2, LEN(une_variable) - 2)

    Mais alors pourquoi le - 2 n'apparait pas dans mon bout de code ?

    Eh ben quand on est dans le MID, une_variable est égal à ''une valeur'' (soit 14 caractères)
    mais quand on est dans le LEN, une_variable = 'une valeur' (soit... 12 caractères, le compte est bon)

    C'est quand même con coldfusion

    Edit : J'ai oublié pourquoi ca peut poser problème... Supposons que l'on veuille que notre variable contienne exactement 3 quote au milieu de la chaine de caractères (je sais pas si ca peut arriver en SQL), vu que coldfusion va vous doubler une des 3 quote mais pas les 2 autres, on va se retrouver avec une chaine de1 caractère trop court, et donc il manquera la quote finale.

    Autre problème, d'ordre de développement : Si vous oubliez une "double quote" dans votre variable (en gros vous mettez une_variable = "'salut l'ami'" au lieu de "'salut l''ami'" (/!\ au guillemets " (1 caractère), quotes ' (un caractère également) et double quotes '' (2 caractères) /!\)) et vous risquez de passer un bon moment à comprendre pourquoi votre requette vous a bouffé un caractère alors que tout était bien fais comme il faut (c'est un peu comme les fautes de frappes qu'on voit pas même en relisant le code 10x)

  3. #3
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Bonjour,

    Je vois que tu n'as pas bien lu la documentation CF. Ce n'est pas de ta faute car même les exemples de CF font cet "erreur".

    Ce code est à proscrire à tout jamais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <cfquery name="ma_query" datasource="ma_source">
      INSERT INTO MA_TABLE (UNE_COLONE_DE_TYPE_VARCHAR)
                  VALUES (#Mid(une_variable, 2, len(une variable))#)
    </cfquery>
    Comment faut-il faire? Quelle sont les bonnes manières de programmer une interrogation à une BD sur CF?

    Il faut utiliser la balise "cfqueryparam" pour plus d'informations voir la documentation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <cfset ma_variable_is_null = (ma_variable eq "")>
    <cfquery name="ma_query" datasource="ma_source">
      INSERT INTO MA_TABLE (UNE_COLONE_DE_TYPE_VARCHAR)
                  VALUES (<cfqueryparam value="#ma_variable#" null="#ma_variable_is_null#" cfsqltype="CF_SQL_VARCHAR">)
    </cfquery>
    Cette approche a des avantages:
    • Le problème des guillemets et des apostrophes est résolu indépendamment de la BD
    • Pour un BD Oracle, on utilise le mécanisme des "BInd Variable" donc une interrogation plus performanate.
    • Possibilité d'insérer des valeurs NULL

  4. #4
    Membre habitué Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 367
    Points : 191
    Points
    191
    Par défaut
    Citation Envoyé par jowo
    Bonjour,

    Je vois que tu n'as pas bien lu la documentation CF. Ce n'est pas de ta faute car même les exemples de CF font cet "erreur".
    En effet je n'ai pas lu la doc CF, vu qu'au boulot on m'a demandé "t'as déjà fais du CF ?
    -Non"
    et qu'on m'a mis sur un projet 100% CF

    D'une il a fallu que je me lance dans le CF (que je trouve très brouillon, qui me rends des pages avec des quantités incroyables d'espaces blancs (vachement bien pour la BP), qui se mélange au HTML (au premier abord, ca parait cool, mais je me suis vite ravisé quand j'ai vu que je ne faisait pas la différence entre le code HTML et le code CF))

    De 2, j'ai pas eu le temps de lire la doc (et quand je suis chez moi j'ai autre chose à faire que de lire la doc de CF ^^ mais faudrait que je m'y colle)

    En plus on m'a mis sur un truc en Fusebox (mélangé entre FB2, FB3 et pas FB du tout, celui qui est passé avant moi découvrait FB ^^) que je ne connaissait pas

    Citation Envoyé par jowo
    Ce code est à proscrire à tout jamais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <cfquery name="ma_query" datasource="ma_source">
      INSERT INTO MA_TABLE (UNE_COLONE_DE_TYPE_VARCHAR)
                  VALUES (#Mid(une_variable, 2, len(une variable))#)
    </cfquery>
    Comment faut-il faire? Quelle sont les bonnes manières de programmer une interrogation à une BD sur CF?

    Il faut utiliser la balise "cfqueryparam" pour plus d'informations voir la documentation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <cfset ma_variable_is_null = (ma_variable eq "")>
    <cfquery name="ma_query" datasource="ma_source">
      INSERT INTO MA_TABLE (UNE_COLONE_DE_TYPE_VARCHAR)
                  VALUES (<cfqueryparam value="#ma_variable#" null="#ma_variable_is_null#" cfsqltype="CF_SQL_VARCHAR">)
    </cfquery>
    Cette approche a des avantages:
    • Le problème des guillemets et des apostrophes est résolu indépendamment de la BD
    • Pour un BD Oracle, on utilise le mécanisme des "BInd Variable" donc une interrogation plus performanate.
    • Possibilité d'insérer des valeurs NULL
    En tout cas merci pour ta réponse claire et précise

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par mioux
    En effet je n'ai pas lu la doc CF, vu qu'au boulot on m'a demandé "t'as déjà fais du CF ?
    -Non"
    et qu'on m'a mis sur un projet 100% CF
    On a des points en communs mioux

    A mon travail, on utilise la fonction PreserveSingleQuotes pour supprimer le doublage de la simple quote pour que les insert puisse fonctionner.
    j'ai appris un peu plus tard le "cfqueryparam" (qui est d'une élégance sans nom), en lisant un article qui parlait des sql injections en coldfusion.
    (http://coldfusion.sys-con.com/read/165921.htm)

    vive iBatis!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/06/2010, 01h48
  2. Interprétation des valeurs NULL et '' (double quotes)
    Par thatsallfunk dans le forum Administration
    Réponses: 2
    Dernier message: 09/01/2009, 15h21
  3. Réponses: 8
    Dernier message: 11/08/2005, 09h32
  4. 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