2012-02-03 100 views
1

我編寫了一個數據庫查詢來提取ColdFusion中的信息,我想知道如何將值傳遞給WHERE子句以獲取相關數據。這是我的代碼示例。任何人都可以幫忙嗎?如何將參數值傳遞給ColdFusion數據庫查詢

<cfquery name="FILM_STRIP_QUERY" datasource="#dsn#"> 
select distinct tm.id as teachingmoduleid, 
     (select concat(prs.first_name, ' ',prs.last_name) AS Video_presenter from presentations pss 
      inner join topics tpcs on tpcs.id = pss.topic_id 
      inner join presenters prs on prs.id = pss.presenter_id 
      where pss.name = ps.name 
      and tpcs.title = tp.title 
      ) AS video_presenter, 
     (select pss.43_png from presentations pss 
      inner join topics tpcs on tpcs.id = pss.topic_id 
      inner join presenters prs on prs.id = pss.presenter_id 
      where pss.name = ps.name 
      and tpcs.title = tp.title) AS png_name 
     from teaching_modules tm 
     inner join tm_segments sg on sg.module_id = tm.id 
     inner join topics tp on tp.id = sg.topic_id 
     inner join presenters prs on prs.id = tm.presenter_id 
     left outer join presentations ps on ps.id = sg.presentation_id 
     where tm.id = 
</cfquery> 

,這是調用函數

<cfloop = "FILM_STRIP_QUERY"> 
    <!--- this is where I wanna pass the parameter---> 
</cfloop> 

回答

2

如果您使用的是CFC,則這樣的功能會工作,包括查詢名稱確保CF釋放從局部變量聲明內存。也使用參數和cfqueryparam函數。

<cffunction name="getFILM_STRIP" access="public" returntype="query" output="false"> 
    <cfargument name="id" required="Yes" type="numeric"> 

    <cfset FILM_STRIP_QUERY = ""> 

    <cfquery name="FILM_STRIP_QUERY" datasource="#variables.dsn#"> 
     <!--- select statement ---> 
     WHERE colname = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.id# /> 
    </cfquery> 

    <cfreturn FILM_STRIP_QUERY> 
</cffunction> 
+0

不要忘記VAR範圍FILM_STRIP_QUERY。此外,此代碼不會按原樣運行,應該是 duncan 2012-02-06 15:21:25

+1

好點,更新後 – jamesTheProgrammer 2012-02-06 15:25:29

5

你的意思是這樣?

<cfset tmId = 5 /> 
<!--- or something like <cfset tmId = url.id /> ---> 
<cfquery name="FILM_STRIP_QUERY" datasource="#dsn#"> 
    <!--- SELECT cols FROM wherever etc... ---> 
    WHERE tm.id = <cfqueryparam cfsqltype="cf_sql_integer" value="#tmId#" /> 
</cfquery> 

你可以只做#TmID是否#沒有CFQueryParam標籤,但它是一個好主意,用它來增加安全性(驗證)和數據庫也將緩存的執行計劃,下一次希望提高性能查詢執行。

+0

如何從調用函數中設置「tmid」? – 2012-02-03 10:35:31

+0

你需要將tmid傳遞給函數。在你的''標籤中添加'tmid =「#form.tmid#」'你可以在cfinvoke函數中使用任何變量名。查看Adobe的實時文檔以獲取更多信息http://help.adobe.com/zh_CN/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7e0a.html – 2012-02-03 12:56:47

+0

取決於您如何調用該功能。如果你正在做filmQuery(5),那麼它會成爲參數[1],除非你在函數中添加了一個CFArgument標籤。嘗試查找關於CFFunction,CFComponent(如果您正在使用它)和CFArgument的信息。 – 2012-02-03 13:13:05

2

您應該使用cfqueryparam標記來執行此操作。這有助於數據庫執行,並有助於防止SQL注入。例如

where tm.id = <cfqueryparam value="#form.ID#" CFSQLType="CF_SQL_INTEGER">