1

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

<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>

我循环正确吗?在我看来,累加器似乎永远不会更新,但循环在我看过的每个地方都是这样完成的。

4

3 回答 3

2

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

变量在结束标记的index位置递增(并且循环重新处理)。from或者换一种说法,主体代码对和to(含)之间的每个索引值执行一次。

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

当您的代码未按预期执行时,您可以使用转储标签对其进行调试:

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

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

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

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

有时空格会导致问题 - 您可能希望使用 trim 函数来确保您处理的是空字符串(尽管在任何地方盲目地包装 trim 函数是丑陋的 - 如果可能,请始终尝试避免引入空格)。

快捷键数组循环

您所拥有的 from/to 循环只有一种类型的 cfloop - 还有其他

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

<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标记参数化您的查询来解决这个问题。(在您不能使用参数的情况下(例如 within ORDER BY),请确保您已经适当地清理了任何动态文本。

不太重要的——它不会改变代码的工作方式,但会暴露出缺乏经验和理解——是多余的散列在locationID. 一个简化的解释是,您通常只需要#s 内部的字符串(即,否则内容将被视为文本,而不是变量的值。)

于 2013-05-01T19:18:35.687 回答
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>

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

于 2013-05-01T15:33:16.077 回答
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 ""

会是这样吗?

于 2013-05-01T15:28:27.160 回答