2010-09-19 24 views
1

Je suis en train de construire une instruction SQL dynamique avec cette ligneConstruire un problème de requête avec coldfusion instruction LIKE

<cfset SQL = "SELECT url, MONTH(event_date) AS months, YEAR(event_date) AS year, event_date, title from events where title LIKE '%#form.event_name#%' "> 

<cfquery name="results" > 
#SQL# 
</cfquery> 

semble qu'il y ait un problème avec la clause comme. Des idées? Ai-je besoin d'échapper au%?

Merci

Répondre

6

Dans un CFQUERY, ColdFusion remplaceront les guillemets simples dans #SQL# avec des guillemets doubles automagiquement.

Donc, en théorie vous devez écrire votre requête comme ceci:

<cfquery name="results" > 
#PreserveSingleQuotes(SQL)# 
</cfquery> 

MAIS ... Il est très dangereux d'accepter une forme variable et l'utiliser sans validation supplémentaire directement dans votre requête. Cela ressemble à une invitation pour les attaques par injection SQL pour moi.

Je préfère utiliser <cfqueryparam> comme ceci:

<cfquery name="results" > 
SELECT url, MONTH(event_date) AS months, YEAR(event_date) AS year, event_date, title 
from events 
where title LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#form.event_name#%"> 
</cfquery> 
+2

En outre, si vous avez besoin de construire la requête dynamique et en cours d'exécution CF9, vous pouvez utiliser la fonction de requête. http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSe9cbe5cf462523a0693d5dae123bcd28f6d-7ffb.html En utilisant cela, vous pouvez insérer un point d'interrogation dans la requête à la place de votre variable et utiliser la méthode addParam. –

+0

Merci de l'avoir signalé! –