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>