2008-11-05 13 views
11

estoy de codificación en ColdFusion, pero tratando de permanecer en cfscript, así que tengo una función que me permite pasar en una consulta para ejecutarlo con <cfquery blah > #query# </cfquery>ColdFusion añadiendo citas adicionales en la construcción de consultas de bases de datos en las cadenas

De alguna manera sin embargo, 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. por lo que 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é sucede esto? Está arruinando mis esperanzas de vivir en cfscript durante la duración de este proyecto

Respuesta

17

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

Para hacer lo que quiera, 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 expone.

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

Puede ser útil leer an old Ben Forta column y a recent post by Brad Wood para obtener más información sobre los beneficios de usar <cfqueryparam>.

4

ColdFusion escapa automáticamente comillas simples comillas en <cfquery> etiquetas cuando se utiliza la siguiente sintaxis:

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

En caso de que desee conservar comillas simples en #Foo# debe llamar #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 este sentido, la función PreserveSingleQuotes() (ver Adobe LiveDocs) no es mucho más que una "operación nula" sobre el valor - convirtiéndolo en un resultado de la función de evitar la auto-escapar.

6

La respuesta a su pregunta, como otros han dicho, está utilizando preserveSingleQuotes(...)

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

Deja tus SQL dentro de las etiquetas cfquery, con cualquier IFS/interruptores/etc según proceda, y garantizar todas las variables CF utilizan la etiqueta cfqueryparam.

(Nota, si utiliza las variables en la cláusula ORDER BY, que tendrá que escapar manualmente cualquier variable; cfqueryparam no se puede utilizar en cláusulas ORDER BY)

0

que votaron por la respuesta de Dave ya que pensé hizo un buen trabajo.

Me gustaría agregar, sin embargo, 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 Transfer 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.

Éstos son 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 asegura que cfqueryparam se utiliza siempre con estas instrucciones de filtro para evitar los ataques de inyección SQL, y hay sintaxis similares para insertar, actualizar y borrar declaraciones . (Hay un par de simple rules to avoid sql-injection.)

Cuestiones relacionadas