1

编辑:问题是重复的,但答案不是!

我有以下代码:

<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 - 变量字段名,虽然问题看起来完全一样,但解决方案不起作用。根据评论,我也收到“无法转换为数字”错误。我注意到 Tomalak 提到了“a little catch”,但从来没有说它是什么。在他链接到的文章中,我尝试了每一种语法等价的形式,但都会引发错误……要么无法转换为数字,要么没有定义。

另外,我知道Evaluate()有开销并且“不应该使用”。我会采用任何有效的解决方案,无论它是否有 Evaluate。

这是在 ColdFusion 9 上。

谢谢

编辑:虽然类似的问题已经有了答案,但这个问题有不同的原因。请参阅下面接受的答案。

4

2 回答 2

6

首先,关于转义输入的标准 blub。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 - 循环访问数据库查询结果时的变量字段名称

于 2013-06-11T22:47:42.777 回答
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 标签。虽然这通常不会成为问题,但他们也声明了查询属性。这以某种方式覆盖了数据库中的原始查询。调用contact.check0工作得很好,但我认为动态构建变量名是试图引用 cfoutput 的查询属性。

感谢 Peter Boughton 提出的提取问题代码的建议……这使我意识到这一点,感谢 Simon 发布了语法正确的代码。积分归他们所有。

于 2013-06-12T14:51:47.580 回答