我在表格中有一组列名称 - 例如foo1,foo2,foo3,foo4。我想通过循环动态引用这些列名:
<cfloop index="i" from="1" to="4">
<cfset foo = Evaluate("query.foo" & i)>
</cfloop>
以上操作不起作用 - 即使 query.foo1 是对查询结果的有效引用,ColdFusion也会抛出“未定义变量”错误。我怎么能这样做?
答案 0 :(得分:21)
不要将Evaluate()
用于此类事情!它很慢而且should be avoided。
<cfloop index="i" from="1" to="4">
<cfset foo = query["foo" & i][query.CurrentRow]>
</cfloop>
或者,如果您愿意:
<cfloop index="i" from="1" to="4">
<cfset foo = query["foo#i#"][query.CurrentRow]>
</cfloop>
Evaluate()
用于评估代码位。不要将它用于可以通过语言集成,更合适的方式更优雅地解决的问题。
编辑:
使用“尖括号”-syntax访问Query对象时,必须附加(从1开始)的行号索引(query["foo#i#"][RowNum]
)。使用传统的“dot”-syntax(query.foo1
)时,当前行是隐式的。
要显式访问当前行,请使用QueryObject.CurrentRow
属性。但它可以是QueryObject.RecordCount
之前的任何正整数。建议对CurrentRow
以外的任何其他内容进行范围检查。
这会打开一个有趣的字段:您可以开始使用“随机访问”查询对象。以前(在CFMX之前)你所能做的就是从头到尾迭代它们,拉出你要找的东西。现在它就像一个嵌套的struct / array数据结构,你可以用不同的方式使用它。
答案 1 :(得分:1)
你非常接近。试试这个:
<cfset query.foo1 = "foo val 1">
<cfset query.foo2 = "foo val 2">
<cfset query.foo3 = "foo val 3">
<cfset query.foo4 = "foo val 4">
<cfloop index="i" from="1" to="4">
<cfset foo = Evaluate("query.foo#i#")>
<cfoutput>#foo#<br></cfoutput>
</cfloop>