CFQUERYPARAM in combinatie met LIKE en IN

18-10-2011 | Marcel van Langen | ColdFusion | operator, MySQL, SQL server, Microsoft, datasource

Iedere rechtgeaarde ColdFusion ontwikkelaar gebruikt de tag CFQUERYPARAM om parameters in te zetten voor een query. De tag draagt zorg voor validatie van het datatype, verbetert de performance van queries en is een effectief wapen tegen SQL injection. Kortom: er is geen excuus om deze tag niet te gebruiken. Maar, hoe moet je bij CFQUERYPARAM omgaan met de LIKE en IN operatoren?

Geef je een parameter mee via CFQUERYPARAM, dan wordt eerst de meegegeven waarde gevalideerd. Is dat goed, dan pas wordt de query naar de database geschoten met een placeholder voor de waarde. Vervolgens worden de waarden naar de database gestuurd, waar deze worden gecombineerd tot een daadwerkelijke query.

Maar nu naar het antwoord op de vraag. Eerst maar eens beginnen met de LIKE operator. Er is een aantal manieren om dit op te lossen. Zo kan gekozen worden voor de volgende notatie (ik heb maar even gekozen voor het varchar datatype, omdat dit het vaakst zal voorkomen):

SELECT column
FROM table
WHERE column LIKE '%' + <CFQUERYPARAM CFSQLTYPE="cf_sql_varchar" VALUE="#arguments.formfield#" /> + '%'

Niet echt een fraaie notatie, nietwaar. Beter leesbaar (en sneller) is de volgende notatie:

SELECT column
FROM table
WHERE column LIKE <CFQUERYPARAM CFSQLTYPE="cf_sql_varchar" VALUE="%#arguments.formfield#%" />

En dan over het gebruik van de IN operator in combinatie met CFQUERYPARAM. ColdFusion zou ColdFusion niet zijn als ook daarvoor niet een eenvoudige oplossing zou zijn:

SELECT column
FROM table
WHERE id IN (<CFQUERYPARAM CFSQLTYPE="cf_sql_integer" VALUE="#arguments.lst_id#" LIST="yes" />)

In dit geval bevat de variabele arguments.lst_id een lijst met ID's. Door de attribute LIST te gebruiken vertel je ColdFusion dat het hierbij gaat om een lijst met meerdere ID's. Een aanvullend probleem is dat soms een lijst leeg kan zijn. In dat geval zou bovengenoemde query leiden tot een error. Om dit te vermijden kun je eenvoudig bovenstaande query uitbreiden tot:

SELECT column
FROM table
WHERE id IN (<CFQUERYPARAM CFSQLTYPE="cf_sql_integer" VALUE="#arguments.lst_id#,0" LIST="yes" />)

Door ,0 toe te voegen aan de VALUE attribute, bevat de lijst met ID's altijd minimaal 1 ID, namelijk 0.

Over Morloff

Morloff ontwerpt en realiseert succesvolle webtoepassingen op het gebied van procesoptimalisatie, eCommerce en rapportage door de inzet van moderne webtechnieken, sociale media en zoekmachine optimalisatie.

over ons | diensten | portfolio | contact | route

naar website IJsmonster.nl naar website ICT intermediairs naar website marcelvanlangen.com

Twitter

Morloff

Cuneraweg 169a
3911 RH Rhenen

M +31 (0)6 - 515 96 189
W www.morloff.nl
E contactformulier

Morloff op Twitter Morloff op Facebook Morloff op LinkedIn Morloff via RSS