coldfusion在表和输出中存储变量而不使用Evaluate

时间:2014-08-12 22:49:14

标签: coldfusion evaluate

我遇到过一个我不知道如何避免使用Evaluate的场景。我已经存储在数据库表会话变量中,当我输出查询结果时,我想显示会话变量的值。

所以这是设置:

插入数据......

<cfquery datasource="TEST" >
insert into testTable (labelVar) values ("session.test")  <- I don't want the value of the session var stored I just want to store the session var
</cfquery>

输出结果......

<cfquery name="qExample" datasource="TEST" >
select labelVar from testTable
</cfquery>

<cfset session.test="Hi!">
<cfset TextValue = Evaluate("#qExample.LabelVar#")>
<cfoutput>#TextValue#</cfoutput> <-Outputs Hi!

现在这一切都有效但如何在不使用评估的情况下完成此操作?

2 个答案:

答案 0 :(得分:2)

如果DB中的值纯粹是作用域变量名,则可以在此处使用structGet()

<cfset TextValue = structGet(qExample.LabelVar)>

我对这个evaluate()本质上不好的指控做了一些研究。我认为它经常是可以避免的,但现在看起来并不是什么大问题:&#39; "evalulate() is really slow". Is it now?&#39;

然而,在考虑使用evaluate()注意以下Leigh的评论时,这是非常重要的:

  

要记住的一件事是如何使用它。评估不挑剔   关于它执行什么。如果在客户提供的值上使用,FORM,URL,   它可能带来一些风险,因此谨慎而明智地使用IMO。

答案 1 :(得分:0)

Adam Cameron的选择是最好的,但这只是实现目标的几种不同方式。

(我创建一个zession范围就像一个快速测试,所以你可以测试你的选择。

<cfset zession = StructNew()>
<cfset zession.test = "Hi there">
<cfset labelvar = "zession.test">

选项1:

<cfoutput>#evaluate(labelvar)#</cfoutput>

选项2:

<cfoutput>#zession[listGetAt(labelvar,2,".")]#</cfoutput>

J只提出选项2以指出更多选项。您的变量是否总是在会话范围内?如果是这样,您可以保存密钥名称而不是整个变量名称。所以,如果labelvar是&#34; test&#34;然后

<cfoutput>#zession[labelVar]#</cfoutput>

多年前,Evaluate()非常糟糕,我认为这种挥之不去的耻辱很好,因为它迫使开发人员在他们可以避免的时候不采用懒惰的方法。以上是一些避免功能较慢的方法。