# Webmasters - Dveloppement Web > Autres langages pour le Web > Coldfusion >  Double quote qui viennent de nulle part

## mioux

Salut

Je suis en train dedvelopper un site en CF (bien entendu, sinon je posterai pas ici) qui utilise une requette, mais j'ai un gros problme de quote qui se transforme en double quote

Voil une partie du code


```

```

Si la condition est valide 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 parenthses et non pas des guillements_

Alors j'ai tent la mme 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 dj 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, mme 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'"

----------


## mioux

J'ai trouv une solution qui n'est pas super  mon got mais qui a le mrite de fonctionner...

Elle est pas super parce que  mon avis, quelqu'un qui va arriver derrire 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 (mme 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)



```

```

Ce que je veux : Tout les caractres de la chaine de caractre, sauf le premier et le dernier
Ma dmarche : Je prends tout les caractres de la chaine,  partir du deuxime, et jusqu' l'avant dernier
C'est  dire : la sous chaine de caractre partant du deuxime caractre, d'une longueur de la taille de la chaine de caractre - 2 (qui est le nombre de caractres)
Retranscrit en coldfusion ca donne 
"La sous chaine de caractre" = "MID(une_variable, "
"En partant du deuxime caractre" = "2, "
"Et de la taille de la chaine de caractre - 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 caractres)
mais quand on est dans le LEN, une_variable = 'une valeur' (soit... 12 caractres, le compte est bon)

C'est quand mme con coldfusion  ::marteau:: 

Edit : J'ai oubli pourquoi ca peut poser problme... Supposons que l'on veuille que notre variable contienne exactement 3 quote au milieu de la chaine de caractres (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 caractre trop court, et donc il manquera la quote finale.

Autre problme, d'ordre de dveloppement : 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 caractre), quotes ' (un caractre galement) et double quotes '' (2 caractres) /!\)) et vous risquez de passer un bon moment  comprendre pourquoi votre requette vous a bouff un caractre alors que tout tait bien fais comme il faut (c'est un peu comme les fautes de frappes qu'on voit pas mme en relisant le code 10x)

----------


## jowo

Bonjour,

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

Ce code est  proscrire  tout jamais


```

```

Comment faut-il faire? Quelle sont les bonnes manires de programmer une interrogation  une BD sur CF?

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



```

```

Cette approche a des avantages:
Le problme des guillemets et des apostrophes est rsolu indpendamment de la BDPour un BD Oracle, on utilise le mcanisme des "BInd Variable" donc une interrogation plus performanate.Possibilit d'insrer des valeurs NULL

----------


## mioux

> Bonjour,
> 
> Je vois que tu n'as pas bien lu la documentation CF. Ce n'est pas de ta faute car  mme 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 dj 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 trs brouillon, qui me rends des pages avec des quantits incroyables d'espaces blancs (vachement bien pour la BP), qui se mlange au HTML (au premier abord, ca parait cool, mais je me suis vite ravis quand j'ai vu que je ne faisait pas la diffrence 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 (mlang entre FB2, FB3 et pas FB du tout, celui qui est pass avant moi dcouvrait FB ^^) que je ne connaissait pas




> Ce code est  proscrire  tout jamais
> 
> 
> ```
> 
> ```
> 
> Comment faut-il faire? Quelle sont les bonnes manires de programmer une interrogation  une BD sur CF?
> 
> ...


En tout cas merci pour ta rponse claire et prcise  ::D:

----------


## rompi

> En effet je n'ai pas lu la doc CF, vu qu'au boulot on m'a demand "t'as dj fais du CF ?
> -Non"
> et qu'on m'a mis sur un projet 100% CF


On a des points en communs mioux  ::P:  

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 lgance sans nom), en lisant un article qui parlait des sql injections en coldfusion.
(http://coldfusion.sys-con.com/read/165921.htm)

vive iBatis!  ::lol::

----------

