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

我试图在coldfusion中创建一个递归函数,但遇到了一些问题

以下是我的逻辑:

<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,我刚刚找到了这个