编辑:QUESTION是重复的,但ANSWER不是!
我有以下代码:
<cfquery name="contact" datasource="thesource">
SELECT * FROM #table# WHERE foo = '#bar#'
</cfquery>
然后再开始(这是问题部分):
<cfloop from="0" to="9" index="i">
<cfset thisvar = Evaluate("contact.check" & i) />
<cfoutput>
#thisvar#
</cfoutput>
</cfloop>
执行时,它会抛出一个很好的大“变量contact.check0未定义”。但是,如果硬编码,#contact.check0#
将输出正常。
有关如何解决此问题的任何想法?
注意: 我见过Coldfusion - variable field name when looping through database query results,虽然问题似乎完全相同,但解决方案不起作用。根据评论,我也得到一个“无法转换为数字”的错误。我注意到Tomalak提到“一点点捕获”,但从未说出它是什么。在他链接到的文章中,我尝试了每个语法上等效的形式,并且它都会抛出错误...要么无法转换为数字,要么未定义。
另外,我知道Evaluate()
有开销,“不应该使用”。我会采取任何有效的解决方案,无论是否有评估。
这是在ColdFusion 9上。
谢谢
编辑:虽然类似的问题已经有了答案,但这个问题有不同的原因。见下面接受的答案。
答案 0 :(得分:6)
首先,关于逃避投入的标准俱乐部。 cfqueryparam存在是有原因的。除此之外,您无需评估即可完成此操作。试试这个,包括检查以确保实际有结果
<!--- make sure that there is actually a result --->
<cfif contact.RecordCount EQ 0>
NO RESULT
<cfelse>
<cfloop from="0" to="9" index="i">
<!--- assumes that you want row 1 --->
<!--- check.CurrentRow could also be used instead of 1 --->
<cfset thisvar = contact['check'&i][1] />
<cfoutput>
#thisvar#
</cfoutput>
</cfloop>
</cfif>
我怀疑它是在尝试评估列而没有指定行号,而在硬编码时你会发现它使用的是当前行。
编辑,因为Dan Bracuk指出这与您在问题中链接的问题完全相同,Coldfusion - variable field name when looping through database query results
答案 1 :(得分:3)
这太荒谬荒谬了。工作代码(稍微移动一下):
<cfoutput>
<cfloop from="0" to="9" index="i">
<cfset thisvar = contact["check"&i][1] />
#thisvar#
</cfloop>
</cfoutput>
不工作代码:
<cfoutput query="contact"> <!--- this line here --->
<cfloop from="0" to="9" index="i">
<cfset thisvar = contact["check"&i][1] />
#thisvar#
</cfloop>
</cfoutput>
其他人在整个页面上放置了cfoutput标签。虽然这通常不会成为问题,但他们也声明了查询属性。这以某种方式覆盖了db的原始查询。调用contact.check0
工作得很好,但我认为,动态构建变量名是试图引用cfoutput的查询属性。
感谢Peter Boughton提出解决问题代码的建议......这使我得以实现这一点,并且Simon发布了语法正确的代码。积分归他们所有。