una simples simple sencilla reemplazar insertar dobles concatenar como comillas comilla caracter buscar sql string coldfusion railo cfml

simples - insertar comillas dobles en sql



ColdFusion agrega comillas adicionales al construir consultas de bases de datos en cadenas (4)

Estoy codificando en ColdFusion, pero tratando de permanecer en cfscript, así que tengo una función que me permite pasar una consulta para ejecutarla con <cfquery blah > #query# </cfquery>

De alguna manera, cuando construyo mis consultas con sql = "SELECT * FROM a WHERE b=''#c#''" y las transfiero, ColdFusion ha reemplazado las comillas simples con 2 comillas simples. entonces se convierte en WHERE b=''''c'''' en la consulta final.

He intentado crear las cuerdas de muchas maneras diferentes, pero no puedo conseguir que deje solo una cita. Incluso hacer un reemplazo de cadena no tiene ningún efecto.

¿Alguna idea de por qué está pasando esto? Está arruinando mis esperanzas de vivir en cfscript por la duración de este proyecto


La respuesta a su pregunta, como han dicho otros, es el uso de preserveSingleQuotes(...)

Sin embargo, la solución que realmente desea no es generar dinámicamente sus consultas de esta manera. Es malo, malo, malo

Coloque su SQL dentro de las etiquetas cfquery, con ifs / switches / etc, según corresponda, y asegúrese de que todas las variables CF usen la etiqueta cfqueryparam .

(Tenga en cuenta que si utiliza variables en la cláusula ORDER BY, deberá escapar manualmente cualquier variable; cfqueryparam no se puede usar en cláusulas ORDER BY)


ColdFusion escapa automáticamente de comillas simples en las etiquetas <cfquery> cuando usa la siguiente sintaxis:

SELECT * FROM TABLE WHERE Foo=''#Foo#''

En caso de que desee conservar comillas simples en #Foo# , debe llamar a #PreserveSingleQuotes(Foo)# .

Tenga en cuenta que el escape automático funciona solo para valores variables, no para resultados de funciones.

SELECT * FROM TABLE WHERE Foo=''#LCase(Foo)#'' /* Single quotes are retained! */

En esa luz, la función PreserveSingleQuotes() (ver Adobe LiveDocs ) no es mucho más que una "operación nula" en el valor, convirtiéndolo en un resultado de función para eludir el escape automático.


Voté la respuesta de Dave porque pensé que hizo un buen trabajo.

Sin embargo, me gustaría añadir que también hay varias herramientas diferentes diseñadas para ColdFusion que pueden simplificar muchas de las tareas comunes de SQL que es probable que realice. Hay una herramienta muy liviana llamada DataMgr escrita por Steve Bryant, así como Transferencia de Mark Mandel, Reactor que fue originalmente creada por Doug Hughes y una que desarrollé llamada DataFaucet . Cada uno de estos tiene sus propias fortalezas y debilidades. Personalmente, creo que es probable que considere que DataFaucet es la que le dará la mejor capacidad para permanecer en cfscript, con una variedad de sintaxis para crear diferentes tipos de consultas.

Aquí están algunos ejemplos:

qry = datasource.select_avg_price_as_avgprice_from_products(); //(requires CF8) qry = datasource.select("avg(price) as avgprice","products"); qry = datasource.getSelect("avg(price) as avgprice","products").filter("categoryid",url.categoryid).execute(); qry = datasource.getSelect(table="products",orderby="productname").filter("categoryid",url.categoryid).execute();


El marco garantiza que cfqueryparam se use siempre con estas declaraciones de filtro para evitar ataques de inyección sql, y hay sintaxis similares para las instrucciones de inserción, actualización y eliminación. (Hay un par de reglas simples para evitar la inyección de SQL ).


ColdFusion, por diseño, escapa de comillas simples al interpolar variables dentro de etiquetas <cfquery> .

Para hacer lo que desea, necesita usar la función PreserveSingleQuotes() .

<cfquery ...>#PreserveSingleQuotes(query)#</cfquery>

Esto no aborda, sin embargo, el peligro de la inyección SQL a la que se está exponiendo.

Usar <cfqueryparam> también permite que su base de datos <cfqueryparam> en caché la consulta, lo que en la mayoría de los casos mejorará el rendimiento.

Puede ser útil leer una columna anterior de Ben Forta y una publicación reciente de Brad Wood para obtener más información sobre los beneficios de usar <cfqueryparam> .