簡體   English   中英

執行數據庫查詢時出錯(WHERE子句出現問題?)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM