如何停止使用evaluate()函数?

时间:2014-05-09 12:52:33

标签: coldfusion evaluate

我在一个名为str_condition

的列下有一个包含值的表 此列中的

值可以是:variables.bit_male / application.bit_male / isdefined('session.int_user_id')

价值可能很复杂。

我需要使用列中值的值。

目前,我正在做的是

<cfif evaluate(query.str_condition)  eq true>
.....code....
</cfif>

现在,我需要省略评估。

4 个答案:

答案 0 :(得分:5)

TBH,我坚持evaluate()为此:你正在利用其中有意义的少数情况之一。如果您在数据库字段中拥有的只是一个表达式(无标签),那么evaluate()将正常工作。

正如其他人所建议的那样......在数据库中存储表达式并不理想,但我可以看到它有时可能是最好的方法,但重新考虑它,以防你可以来完全采用不同的方法(这是针对具体情况的,因此我们无法真正为您提供指导)。

唯一可行的选择是将数据库中的代码编写到文件然后include,但我认为这比使用evaluate()更糟糕。

许多人对evaluate()的问题很不满意,没有真正停下来思考为什么会这样......在大多数情况下人们都不需要这样做,但它完全没问题需要它的情况(例如你的)。

答案 1 :(得分:2)

这是一个经过编辑的答案,因为我最初误解了这个问题。

在许多情况下,数组表示法是你的自由

<cfif queryname['fieldname'][rownumber] is true>
code for true

请注意,未引用queryname,但字段名为。如果您不引用字段名称,ColdFusion会认为它是变量。

同样相关的是,如果要将数据存储在数据库中,例如代码,要选择然后执行,则必须选择这些内容,将它们写入另一个.cfm文件,然后cfinclude该文件。这有点低效。

在您的情况下,您在数据库中存储变量名称。如果使用evaluate给你正确的结果,你改变的任何东西都可能会变得更糟。

答案 2 :(得分:0)

数据库中存在多少个唯一组合?如果没有开发人员的互动,新的价值会出现吗?

如果合理数量的可能值不会发生变化,请使用switch语句并编写处理每个可能值的代码行。

<cfswitch expression="#query.str_condition#"> <cfcase value="variables.bit_male"> <cfset passed = variables.bit_male> </cfcase> <cfcase value="application.bit_male"> <cfset passed = application.bit_male> </cfcase> <cfcase value="isdefined('session.int_user_id')"> <cfset passed = isdefined('session.int_user_id')> </cfcase> <cfdefaultcase> <cfset passed = false> </cfdefaultcase> </cfswitch> <cfif passed> .....code.... </cfif>

您不必手写所有这些,您可以使用SQL查询生成coldfusion代码的重复部分。

SELECT DISTINCT '<cfcase value="' + replace(table.str_condition,'"','""') + '"><cfset passed = ' + table.str_condition + '></cfcase>' as cfml FROM table ORDER BY len(str_condition), str_condition

答案 3 :(得分:0)

如果我正确地阅读此内容,您不仅仅是在数据库中存储变量名称,而是将实际的代码片段存储为[isDefined(session.it_user_id)]。

如果这是你正在做的事情,那么你需要停下来并重新思考你想要实现的目标。在您的数据库中存储代码并使用evaluate来执行它是一个非常糟糕的主意。

听起来我正在尝试创建一个通用代码块,您可以在多个位置复制粘贴,只需在数据库中设置条件逻辑。

简短的回答不是找到使用评估的方法,而是停止在数据库中完全停止存储代码。