我在一个名为str_condition
值可以是:variables.bit_male
/ application.bit_male
/ isdefined('session.int_user_id')
价值可能很复杂。
我需要使用列中值的值。
目前,我正在做的是
<cfif evaluate(query.str_condition) eq true>
.....code....
</cfif>
现在,我需要省略评估。
答案 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来执行它是一个非常糟糕的主意。
听起来我正在尝试创建一个通用代码块,您可以在多个位置复制粘贴,只需在数据库中设置条件逻辑。
简短的回答不是找到使用评估的方法,而是停止在数据库中完全停止存储代码。