[英]Error Executing Database Query (issue with WHERE clause?)
我正在嘗試使用CF變量為FIELDS和WHERE子句構建查詢。
我正在使用以下代碼獲得“執行數據庫查詢時出錯”。 當我渲染CF變量以給出文字,然后將查詢主體基於結果文字時,一切正常。 我已經確認#strFlds#部分可以正常工作,但它似乎在#strWhere#部分窒息。 使用WHERE子句的變量是否有問題? (如果重要,數據源是SQL-Server數據庫)。
<cfset strWhere = " WHERE SCHYEAR = '#Form.yrVal#'">
<cfset strFlds = "T1, T2">
<cfquery name="qryFld" datasource="TSQL">
SELECT #strFlds# FROM TABLE1 #strWhere#
</cfquery>
您最有可能遇到阻止SQL注入的CF安全功能。
最好將where語句變量移動到cfqueryparams中。
SELECT #strFlds#
FROM Table1
WHERE SCHYear = <cfqueryparam value="#form.yrVal#" cfsqltype="cf_sql_varchar">
這是因為你構建SQL語句的方式是你在SQL本身中有硬編碼的值,即:
<cfset strWhere = " WHERE SCHYEAR = '#Form.yrVal#'">
這里面有兩個SQL: WHERE SCHYEAR =
和一個值: '#Form.yrVal#'
。 一個人不應該真的這樣做,事實上,當你的價值觀進一步嵌入表達式中時,ColdFusion會不顧一切地混淆它,以便降低SQL注入的風險(如果你是將源自form
值直接傳遞給DB。這是非常糟糕的做法。
您需要做的是將值作為參數傳遞給DB驅動程序。 一種方法是將值與SQL語句中最終使用的值分開。 @Chris已經通過內聯<cfqueryparam>
標記向您展示了一種方法。 如果您使用<cfquery>
標簽,這是唯一的方法。
如果您正在使用ColdFusion 11(始終確保在此處提出問題時指定使用的CF版本,順便說一句),那么您可以在SQL中使用占位符作為參數,因此:
<cfset qryFld = queryExecute("
SELECT #strFlds# FROM TABLE1 WHERE SCHYEAR = ?
", [{value=Form.yrVal, cfsqltype="CF_SQL_VARCHAR"}])>
如果您使用的是CF9-10,那么使用Query.cfc可以實現同樣的功能。
qryFld = new Query(
sql = "SELECT #strFlds# FROM TABLE1 WHERE SCHYEAR = ?",
parameters = [{value=Form.yrVal, cfsqltype="CF_SQL_VARCHAR"}]
).execute().getResult();
使用<cfquery>
以這種方式完全將SQL與SQL分離是不可能的,這在實現上有點不足。 我已經為此提出了一張票,你可能想投票給它: 在<cfquery>
從SQL中分離參數 。
進一步相關閱讀(來自我的博客):
您應該在cfquery
本身內部創建查詢字符串,而不是使用變量構建查詢。 而且如果你想創建查詢字符串動態的各個部分,你總是可以使用條件語句。 和Chris建議總是嘗試使用cfqueryparam
將值傳遞給查詢。 像這樣。
<cfquery name="xyz" datasource="abc">
SELECT
<cfif condition>
col1
</cfif>
<cfif condition>
, col2
</cfif>
FROM TABLE1
WHERE 1=1
<cfif condition>
AND col1 = <cfqueryparam value="#form.formfield1#" cfsqltype="cf_sql_varchar">
</cfif>
<cfif condition>
AND col2 = <cfqueryparam value="#form.formfield12#" cfsqltype="cf_sql_varchar">
</cfif>
</cfquery>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.