开发人员指南的第116页说:"与cfloop标记不同,CFScript for-in循环不提供内置支持来循环查询和列表."
问:如何使用ColdFusion 9中的新脚本语法循环列表?
<cfloop list="#qry.Columnlist#" index="FieldName">
<cfset form[FieldName] = qry[FieldName][1]>
</cfloop>
Run Code Online (Sandbox Code Playgroud) 我开发使用ColdFusion并想知道循环大查询结果集的最佳策略是什么.使用cfloop和cfoutput之间有任何性能差异吗?如果没有,是否有理由更喜欢一个而不是另一个?
我很好奇为什么会这样.我现在已经遇到过两次了,经过大量的谷歌搜索后,我找不到任何我理解的理由.它的要点:
查询1:selectContent(6条记录;没有空格/空值等)
查询2:selectPricing(5条记录;没有空格/空值等)
输出:
<cfloop query="selectContent">
<section>
#selectContent.h2#
<cfif selectContent.id eq 3>
<cfloop query="selectPricing" group="groupCol">
<table class="pricing">
<thead>
<tr>
<th>#description#</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<cfloop>
<tr>
<td>#selectPricing.description#</td>
<td>#selectPricing.price#</td>
</tr>
</cfloop>
</tbody>
</table>
</cfloop>
</cfif>
#selectContent.content#
</section>
</cfloop>
Run Code Online (Sandbox Code Playgroud)
这将产生以下错误:数组索引超出范围:5
仅当第二个查询的记录少于第一个查询时才会出现此错误.基本上感觉就像第一个cfloop从第二个接管循环迭代,这导致了问题,但也只有当你有第三个分组cfloop.整个内部cfloop运行,就像在源中一样.
我想出了两种方法来解决这个问题:
那么,有两个问题:
为什么会发生这种情况?
我是否应该在这里使用一种完全不同的方法(谷歌/因此没有找到其他人这个问题的事实似乎肯定暗示......)?
编辑 我已根据Adam Cameron的反馈将此作为Coldfusion错误提交.Bug#3820049
我想通过函数处理查询中的一行,我将该行作为结构传递.
理想情况下...
<cfloop query="myquery">
#myfunction(#row#)#
</cfloop>
Run Code Online (Sandbox Code Playgroud)
我也可以像这样设置它......
<cfloop query="myquery">
#myfunction(#col1#,#col2#,#col3#,#col4#)#
</cfloop>
Run Code Online (Sandbox Code Playgroud)
但我不想.我找不到一个简单的提取行的方法,但我想我会问.
有没有更好的方法来写下面的内容?
<cfloop list="#qry.Columnlist#" index="FieldName">
<cfset "form.#FieldName#" = Evaluate("qry.#FieldName#")>
</cfloop>
Run Code Online (Sandbox Code Playgroud)
此循环将查询中的每个字段分配给相应的表单字段.我理解评估函数是避免的.
我cfloop在一个查询中.我想获得一个属性,但是直到运行时我才知道该属性是什么.使用#qryResult[MyAttr]#失败并显示错误"复杂对象类型无法转换为简单值".这样做的语法是什么?
这是一个简化的例子:
<cfquery datasource="TestSource" name="qryResult">
SELECT * FROM MyTable
</cfquery>
<cfloop query="qryResult">
<cfset MyAttr="autoid" />
<cfoutput>
Test 1: #qryResult.autoid# <br/> <!--- succeeds --->
Test 2: #qryResult[MyAttr]# <br/> <!--- fails --->
</cfoutput>
</cfloop>
Run Code Online (Sandbox Code Playgroud) 嗨,我有一个输出循环
<cfloop collection="#SESSION.squad.achievements#" item="key">
Run Code Online (Sandbox Code Playgroud)
问题是密钥(这是一年)以错误的顺序输出,它输出
2009年
2010
2011
据我所知,没有内置的方法来改变订单或我错过了什么?
我有一个购物车阵列,它有一个变量告诉我产品是否是附件,这将是是或否.我需要遍历购物车并找出以下内容:
我一直在尝试这个:
<cfloop index="i" from="1" to="#arrayLen(session.mycart)#">
<cfif session.mycart[i].accs EQ "yes">
<cfset accPresent = "yes">
</cfif>
<cfif session.mycart[i].accs EQ "no">
<cfset prodpresent = "yes">
</cfif>
</cfloop>
<cfif accPresent EQ "yes" and prodPresent EQ "no">
<cfset bothPresent EQ "yes">
</cfif>
Run Code Online (Sandbox Code Playgroud)
由于没有找到accPresent,这种情况就会失败,我认为这是因为循环经历一个循环,并且一旦找到非附属产品,accs就不等于是.实现我想要做的事情的最佳方法是什么?
我试图循环一个2-D尺寸为的数组,12000 * 20我不断得到java.lang.OutOfMemoryError.
最初我认为这可能是因为堆大小所以我增加了我的堆大小但我仍然得到相同的错误.所以我像这样运行垃圾收集器:
<cflock name="checkMemory" type="exclusive" timeout="1" throwontimeout="yes">
<cfset objSystem = CreateObject( "java", "java.lang.System" )>
<cfset objSystem.gc()>
</cflock>
Run Code Online (Sandbox Code Playgroud)
我倾倒了周围的空闲记忆850MB:
<cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()>
<cfset freeMemory = runtime.freeMemory()>
<cfdump var="#freeMemory#" label="free">
Run Code Online (Sandbox Code Playgroud)
在这里,我试图创建一个XML变量,并在循环时我收到堆错误:
<cfxml variable="variables.XML">
<cfoutput>
<ROWS>
<cfloop from="3" to="#arrayLen(local.array)#" index="i" step="1">
<ROW>
<cfloop from="1" to="#arrayLen(local.array[2])#" index="j" step="1">
<#ucase(local.array[2][j])#>
<![CDATA[#trim(local.array[i][j])#]]>
</#ucase(local.array[2][j])#>
</cfloop>
</ROW>
</cfloop>
</ROWS>
</cfoutput>
</cfxml>
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪:
java.io.WinNTFileSystem.getBooleanAttributes(Native Method)的java.lang.OutOfMemoryError,位于coldfusion的coldfusion.xml.XmlProcessor.getSourceURL(XmlProcessor.java:246)的java.io.File.exists(File.java:733). xml.XmlProcessor.parse(XmlProcessor.java:155)在coldfusion.tagext.lang.XmlTag.doEndTag(XmlTag.java:85)在cffeeds2ecfc1003675922 $ funcDEMO1._factor8(C:\部件\ abc.cfc:1235)在cffeeds2ecfc1003675922 $在coldfusion的coldfusion.runtime.UDFMethod $ ReturnTypeFilter.invoke(UDFMethod.java:405)的coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472)的funcDEMO1.runFunction(C:\ component\abc.cfc:1192). runtime.UDFMethod $ ArgumentCollectionFilter.invoke(UDFMethod.java:368)在coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55)在coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321)在coldfusion.runtime.UDFMethod .invoke(UDFMethod.java:220)at coldfusion.runtime.CfJspPage._invokeUDF(CfJspPage.java:2582)at …
感谢回复!!但我仍然无法做到这一点.我得到的错误是"类型objGet1在类型类coldfusion.runtime.VariableScope类型的Java对象中未定义."
以下是我的完整代码.我只想转储包含cfhttp信息的每个线程的值.
http://www.google.com/search?"&"q = Vin + Diesel"&"&num = 10"&"&start =")/>
<cfset intStartTime = GetTickCount() />
<cfloop index="intGet" from="1" to="10" step="1">
<!--- Start a new thread for this CFHttp call. --->
<cfthread action="run" name="objGet#intGet#">
<cfhttp method="GET" url="#strBaseURL##((intGet - 1) * 10)#" useragent="#CGI.http_user_agent#" result="THREAD.Get#intGet#" />
</cfthread>
</cfloop>
<cfloop index="intGet" from="1" to="10" step="1">
<cfthread action="join" name="objGet#intGet#" />
<cfdump var="#Variables['objGet'&intGet]#"><br />
</cfloop>
Run Code Online (Sandbox Code Playgroud)
当我在循环中加入线程后使用.我得到了预期的结果谢谢!!