Coldfusion中的递归函数
我试图在coldfusion中创建一个递归函数,但遇到了一些问题 以下是我的逻辑:Coldfusion中的递归函数,coldfusion,recursion,Coldfusion,Recursion,我试图在coldfusion中创建一个递归函数,但遇到了一些问题 以下是我的逻辑: <cffunction name="getEvents" access="private"> <cfargument name="strtdate"> <cfargument name="parentID" default=0> <cfqeury name="qry" datasource="db"> select * from tabl
<cffunction name="getEvents" access="private">
<cfargument name="strtdate">
<cfargument name="parentID" default=0>
<cfqeury name="qry" datasource="db">
select *
from table
where parentid = #parentid# and
starttime between #strtdate# and #DateAdd('d', 1, strtdate)#
</cfquery>
<cfset events = arraynew(1)>
<cfloop query="qry">
<cfset events[qry.currentrow] = structnew()>
<cfset events[qry.currentrow].id = qry.id>
<cfset subevents = getEvents(strtdate, qry.id)>
<cfif arraylen(subevents)>
<cfset events[qry.currentrow].subevents = subevents>
</cfif>
</cfloop>
<cfreturn events>
</cffunction>
问题是,一旦函数调用自己,一旦它在循环中丢失了原始查询,它就会调用自己。我现在知道这些事件有三个级别,但我不想为了处理所有事件而不得不重复相同的代码
我希望最终得到一个结构数组,其中包含给定日期的所有事件和子事件。确保变量的作用域是变量,使它们在每次函数调用时保持局部 如果在CF8或更早版本中,在顶部的函数中:
<cfset var qry = ''>
<cfset var events = ''>
<cfset var subevents = ''>
尝试对查询对象进行var作用域分析。事实上,您通常应该使用适当的范围。例如:
<cffunction name="getEvents" access="private">
<cfargument name="strtdate">
<cfargument name="parentID" default=0>
<cfset var qry = "" />
<cfset var events = "" />
<!--- etc. --->
<cfquery name="qry" datasource="db">
select *
from table
where parentid = #parentid# and
starttime between #ARGUMENTS.strtdate#
and #DateAdd('d', 1, ARGUMENTS.strtdate)#
</cfquery>
... etc.
否则,一切都将进入变量范围,并覆盖我怀疑的其他变量
希望有帮助
PS:你也应该考虑在你的查询中使用。 解释这一点的重要性将有助于未来的人们。为什么这个问题是由变量范围不确定引起的?谢谢。这就成功了。我的代码中有CFQueryParam,但我不想写得比我需要的更多。Edward,我刚刚找到了这个