理解循环时遇到一些麻烦

时间:2013-05-01 15:17:49

标签: coldfusion cfloop

我出于某种原因创建了这个,其中没有一个查询正在更新

<cfloop index="i"  from="1" to="#ArrayLen(location)#">

    <cfif location[i] NEQ "" AND #locationID# EQ "" >

        <cfquery Name="UpdateAddActivity" DATASOURCE="#DS#">        
            INSERT INTO tblProjectLocations
            (   
                projectID,
                locationID
            )
            VALUES
            (   
                #ProjectName#,
                #location[i]#
            )
        </cfquery>

    </cfif>

    <cfif location[i] EQ "" AND #locationID# NEQ "" >

        <cfquery Name="UpdateAddActivity" DATASOURCE="#DS#">        
            DELETE FROM tblProjectLocations
            WHERE locationID = #locationID# AND projectID = #ProjectName# 
        </cfquery>              

    </cfif>

</cfloop>

我是否正确循环?对我来说似乎不会更新累加器,但是在我看过的每个地方都以这种方式完成循环。

3 个答案:

答案 0 :(得分:2)

您的cfloop代码很好 - 您只需要基本循环的index / from / to属性。

index变量在结束标记的位置递增(并且循环重新处理)。换句话说,对fromto(包括)之间的每个索引值执行一次正文代码。

有关信息,您可以通过指定step属性来更改默认增量(1)(尽管这显然对数组循环没有意义)。

当您的代码未按预期执行时,您可以使用dump标记进行调试:

<cfloop ... >
    ... 
    <cfdump var=#locationID# abort />
    ...
</cfloop>

abort属性将停止处理 - 循环不会迭代,并且将返回当前页面内容(它是分别指定cfabort标记的简写。

您可以使用多个转储,并使用label属性来帮助确定哪个是哪个,但显然如果使用abort属性,请确保只有最后一个具有它。

如前所述,您提供的代码段中未定义locationID,因此可能是问题。

有时空间可能会导致问题 - 您可能希望使用trim函数来确保处理空字符串(尽管盲目地将修剪函数包装在各处都很难看 - 如果可能的话,请尽量避免引入空格)。

快捷方式阵列循环

你到达的from / to循环只有一种cfloop - 有others

具体来说,当您不需要数字索引时,会有一个简写数组循环:

<cfloop index="CurLocation" array=#Location# >
    ...
</cfloop>

相当于:

<cfloop index="i" from=1 to=#ArrayLen(Location)# >
    <cfset CurLocation = Location[i] />
    ...
</cfloop>

但没有未使用的i变量。 (如果您需要i变量,请坚持从/到。)

请注意,在函数内部,您应该几乎总是写index="local.i"index="local.CurLocation"以确保变量具有适当的范围。这不是循环所特有的 - 它适用于任何创建变量的标记。您也可以在循环之前执行<cfset var i = 0 />来执行相同的操作。

无关的问题

您的代码还有其他一些问题。

最重要的是,您展示的代码可能存在SQL注入的风险。您几乎不应该使用裸哈希编写SQL,而是使用cfqueryparam标记对您的查询进行参数化来解决此问题。 (在无法使用参数的情况下(例如在ORDER BY内),请确保已对所有动态文本进行了适当的清理。

不太重要 - 它不会改变代码的工作方式,但会背叛缺乏经验和理解 - 是围绕locationID的多余的哈希。一个简单的解释是,您通常只需要#内部字符串(即内容将被视为文本,而不是变量的值。)

答案 1 :(得分:1)

如有疑问,请查看您的数据。

<cfoutput>

<cfloop index="i"  from="1" to="#ArrayLen(location)#">
 i is #i# <br>

<cfif location[i] NEQ "" AND locationID EQ "" >
 true location is #location[i]# <br>
<cfelse>
false location [i] is is #location[i]# and 
locationid is #locationID# <br>

</cfif>

<cfif location[i] EQ "" AND locationID NEQ "" >
 same as above
</cfif>

</cfloop>
</cfoutput>

然后你会知道为什么你没有得到你期望的结果。

答案 2 :(得分:0)

只要您的位置数组中有项目,循环就会运行,CFLoop标记将负责增加i。

我猜测的是你正在检查循环中的两个条件,如果两者都不匹配,则不运行任何代码。你正在处理这些:

location[i] NEQ "" AND #locationID# EQ ""
location[i] EQ "" AND #locationID# NEQ ""

但不是这些:

location[i] EQ "" AND #locationID# EQ ""
location[i] NEQ "" AND #locationID# NEQ ""

可能是吗?