2016-04-06 74 views
0

我正在嘗試執行與用戶輸入的表單數據匹配我的trans_location列的查詢。我有一個讓用戶選擇多個位置的下拉菜單。當他們選擇多個時,它會在每個位置之間放置逗號。當我只選擇一個位置時,結果會返回正確的位置。但是,當我選擇多個位置時,它找不到任何位置。逗號是否只有一個名稱,它不會搜索每個位置?使用由用戶輸入的表單變量的CF查詢

enter image description here

<cfset result = {} /> 
<cftry> 
    <cfset date1 = #CREATEODBCDATETIME(form.StartDate & '00:00:00')#> 
    <cfset date2 = #CREATEODBCDATETIME(form.EndDate & '23:59:59')#> 

    <cfquery datasource="#application.dsn#" name="GetLocationInfo"> 
     SELECT * 
     FROM cl_checklists 
     WHERE date >= #date1# AND date <= #date2# 
     AND trans_location = '#form.Location#' 
    </cfquery> 

<cfoutput>#date1#</cfoutput> 
<cfoutput>#date2#</cfoutput> 

<cfdump var="#GetLocationInfo#"> 

    <cfcatch type="any"> 
     <cfset result.error = CFCATCH.message > 
     <cfset result.detail = CFCATCH.detail > 
    </cfcatch> 
</cftry> 

我也試着做這樣的事情:
AND trans_location = <cfqueryparam value='#form.Location#' />

+0

與你的問題沒有關係,但我發現選擇控件可以讓多個選擇真的很容易搞砸。你可能會考慮複選框。 –

+0

注意,如果您需要在整個日期進行過濾,則正確的比較是'WHERE Col> = {startDateAtMidnight} AND Col <{dayAfterEndDateAtMidnight}']。有關更多詳細信息和正確的cf_sql_type,請參閱[本主題](http://stackoverflow.com/a/27062906/104223)。 – Leigh

回答

3

您需要用list="true"屬性與cfqueryparam使用INoperator結合。 (這裏是cfqueryparam快速有用的教程:https://www.petefreitag.com/item/677.cfm

最後:永遠,永遠發送參數數據庫時,總是使用cfqueryparam

<cfset result = {} /> 
<cftry> 
    <cfset date1 = CREATEODBCDATETIME(form.StartDate & '00:00:00')> 
    <cfset date2 = CREATEODBCDATETIME(form.EndDate & '23:59:59')> 

    <cfquery datasource="#application.dsn#" name="GetLocationInfo"> 
     SELECT * 
     FROM cl_checklists 
     WHERE date >= <cfqueryparam value="#date1#" cfsqltype="cf_sql_timestamp" /> 
       AND date <= <cfqueryparam value="#date2#" cfsqltype="cf_sql_timestamp" /> 
       AND trans_location IN (<cfqueryparam value="#FORM.location#" cfsqltype="cf_sql_varchar" list="true" /> ) 
    </cfquery> 

<cfoutput>#date1#</cfoutput> 
<cfoutput>#date2#</cfoutput> 

<cfdump var="#GetLocationInfo#"> 

    <cfcatch type="any"> 
     <cfset result.error = CFCATCH.message > 
     <cfset result.detail = CFCATCH.detail > 
    </cfcatch> 
</cftry>