Coldfusion 理解循环有困难吗

Coldfusion 理解循环有困难吗,coldfusion,cfloop,Coldfusion,Cfloop,我之所以创建这个查询,是因为没有一个查询被更新 <cfloop index="i" from="1" to="#ArrayLen(location)#"> <cfif location[i] NEQ "" AND #locationID# EQ "" > <cfquery Name="UpdateAddActivity" DATASOURCE="#DS#"> INSERT INTO tblP

我之所以创建这个查询,是因为没有一个查询被更新

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

插入到tblProjectLocations中
(   
投射的,
位置ID
)
价值观
(   
#项目名称#,
#地点[i]#
)
从tblProjectLocations中删除
其中locationID=#locationID#和projectID=#ProjectName#

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

只要位置数组中有项目,循环就会运行,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 ""

可能是这样吗?

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

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

我是#我#
真正的位置是#位置[i]#
错误位置[i]是#位置[i]#和 locationid为#locationid#
同上
然后您就会知道为什么没有得到预期的结果。

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

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

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

当代码未按预期执行时,可以使用以下标记对其进行调试:

这相当于:

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

...
但是没有未使用的
i
变量。(如果需要
i
变量,请坚持使用from/to。)

请注意,在函数内部,您几乎应该始终编写
index=“local.i”
index=“local.CurLocation”
,以确保变量的范围适当。这不是循环独有的,它适用于创建变量的任何标记。您还可以在循环之前执行
,以执行相同的操作

无关问题 您的代码还存在一些其他问题

最重要的是,您显示的代码可能存在SQL注入的风险。您几乎不应该在编写SQL时使用简单的散列,而应该使用标记参数化查询来解决这个问题。(在无法使用参数的情况下(例如在
ORDER BY
中),请确保已对任何动态文本进行了适当的清理


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

locationid变量看起来有点神秘。它从何而来?它可以通过添加来测试数据,或许可以确保值与您预期的值相同。顺便说一句,英镑在
#locationid#EQ中签名
是多余的。另外,我希望在您实际使用的代码中,您使用的
cfqueryparam
\locationID
应该是cfifsTrue中的
locationID
,但我只是从OP中复制。您的答案不必复制OP:)#var#至少早在cf 6时就被macromedia记录为不良行为,可能是后来,但很难/不可能找到所有的旧文档。不良行为?:/这当然不是好的行为,但除了丑陋和不理解之外,这并不是真正的世界末日。我并不同意盲目复制OPs尽管如此-[插入关于悬崖和旅鼠的评论];o)2005年我从livedocs中得到的引语是。Macromedia建议您仅在必要时使用英镑符号。下面的示例显示了引用变量的首选方法。相比之下,请注意以下示例,该示例不必要地使用磅符号:
<cfloop index="CurLocation" array=#Location# >
    ...
</cfloop>
<cfloop index="i" from=1 to=#ArrayLen(Location)# >
    <cfset CurLocation = Location[i] />
    ...
</cfloop>