我遇到过一个我不知道如何避免使用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!
现在这一切都有效但如何在不使用评估的情况下完成此操作?
答案 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()非常糟糕,我认为这种挥之不去的耻辱很好,因为它迫使开发人员在他们可以避免的时候不采用懒惰的方法。以上是一些避免功能较慢的方法。