有一些很难理解的循环(Having some trouble understanding loops

2019-10-18 02:17发布

我创造了这个因某些原因没有被更新的一个查询

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

我是不是正确的循环? 它似乎并不喜欢我,蓄能器永远会被更新,但循环的完成这样每次我看着的地方。

Answer 1:

你CFLOOP标签是好的 -你只需要指数/从/到一个基本的循环属性。

index变量在结束标记的位置增加(以及环路再处理)。 或者换一种说法,人体代码是针对各指标值执行一次fromto (含)。

有关信息,您可以通过指定的变化(1)的默认增量step属性(尽管这显然不会使数组循环意义上的)。

如果未达到预期效果你的代码,你可以用它进行调试转储标签:

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

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

您可以使用多个转储,以及label属性,以帮助确定哪个是哪个,但很明显,如果使用中止属性确保只有最后一个拥有它。

正如已经提到locationID没有在您所提供的片段定义的,因此可能是问题。

有时空间会带来问题 - 你可能想使用裁剪功能,以确保您与空字符串处理(虽然盲目到处包裹装饰功能是丑陋的 - 总是试图请尽量避免导入空间)。

快捷阵列环流式

该自/至环路你得只有一种类型的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标签-来解决这个问题。 (在情况下,您不能在使用参数(例如ORDER BY ),请确保您有适当的消毒任何动态文本。

不太重要的-它不改变代码是如何工作的,但确实背叛缺乏经验和体会-周围多余的哈希locationID 。 一个简化的解释是,你通常只需要#里面串S(即其中的内容,否则将视为文本,而不是一个变量的值。)



Answer 2:

如果有疑问,看看你的数据。

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

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



Answer 3:

只要有你的位置数组项,循环运行和CFLOOP标签将采取增加我的照顾。

我猜发生的事情是,你正在检查的循环中的两个条件,如果没有比赛,没有代码将运行。 你处理这些:

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

但不是这些:

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

莫非是吗?



文章来源: Having some trouble understanding loops