2014年5月13日 星期二

Coldfusion 對 query 語句生成

一般的 query 查詢方式

<cfquery name="QryName" DataSource="ConnecttionName">
SELECT field-A,field-B
FROM TableName
WHERE strfield = '#sdata#'
AND numfield = #ndata#
AND dtmfield = #parseDatetime(dtdata)#
</cfquery>

上面是純粹帶『查詢資料』進去 Query 語句時所使用的方式,SQL語句屬於固定類的,
但若你把它改成動態語句:

<cfset qs = "strfield = '#sdata#' AND numfield = #ndata# AND dtmfield = #parseDatetime(dtdata)#">
<cfquery name="QryName" DataSource="ConnecttionName">
SELECT field-A,field-B
FROM TableName
WHERE #qs#
</cfquery>

這個語句絕對會失敗的,
因為 Coldfusion 為了防止 SQL injection 所以會對 生成 SQL語句的變數裡 ' single-quotation 產生escape 字元,導致生成了不是你想像中的語句。

正確的作法,如果你希望使用動態語句生成,那就是加個指令要求ColdFusion不要去處理 single-quotation 問題即可解決:

<cfset qs = "strfield = '#sdata#' AND numfield = #ndata# AND dtmfield = #parseDatetime(dtdata)#">
<cfquery name="QryName" DataSource="ConnecttionName">
SELECT field-A,field-B
FROM TableName
WHERE #PreserveSingleQuotes(qs)#
</cfquery>

0 個回應: