我出于某种原因创建了这个,其中没有一个查询正在更新
<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>
我是否正确循环?对我来说似乎不会更新累加器,但是在我看过的每个地方都以这种方式完成循环。
答案 0 :(得分:2)
您的cfloop代码很好 - 您只需要基本循环的index / from / to属性。
index
变量在结束标记的位置递增(并且循环重新处理)。换句话说,对from
和to
(包括)之间的每个索引值执行一次正文代码。
有关信息,您可以通过指定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 ""
可能是吗?