我创造了这个因某些原因没有被更新的一个查询
<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>
我是不是正确的循环? 它似乎并不喜欢我,蓄能器永远会被更新,但循环的完成这样每次我看着的地方。
你CFLOOP标签是好的 -你只需要指数/从/到一个基本的循环属性。
该index
变量在结束标记的位置增加(以及环路再处理)。 或者换一种说法,人体代码是针对各指标值执行一次from
和to
(含)。
有关信息,您可以通过指定的变化(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(即其中的内容,否则将视为文本,而不是一个变量的值。)
如果有疑问,看看你的数据。
<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>
然后你就会知道为什么你没有得到你所期望的结果。
只要有你的位置数组项,循环运行和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 ""
莫非是吗?