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>

留言

這個網誌中的熱門文章

【研究】列印的條碼為什麼很難刷(掃描)

C# 使用 Process.Start 執行外部程式

統一發票列印小程式