【问题标题】:How can I stop using evaluate() function?如何停止使用 evaluate() 函数?
【发布时间】:2014-05-09 12:52:32
【问题描述】:

我有一个表,列下的值名为:str_condition

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

值可以很复杂。

我需要使用列中的值。

目前,我正在做的是

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

现在,我需要省略评估。

【问题讨论】:

  • FWIW,“如果(某事)为真”是多余的。你可以说“如果(某事)”。
  • 仅供参考,我在房子里转了一圈evaluate() 的各种用途,以及如何在我的博客上不使用它:cfmlblog.adamcameron.me/2013/08/…
  • @3524344 不一定。如果 query.str_condition 并不总是一个布尔值(可能是一个空字符串),那么它就不一样了。
  • 您需要提供更多关于正在做什么的上下文 - 为什么将变量名称和检查存储在查询列中?
  • 我会在这个上第二次@PeterBoughton。我们需要更多信息,在数据库中存储变量名似乎是个糟糕的主意。

标签: coldfusion evaluate


【解决方案1】:

TBH,为此,我会坚持使用evaluate():您正在利用它有意义的少数情况之一。如果您在 DB 字段中拥有的只是一个表达式(没有标签),那么 evaluate() 就可以正常工作。

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

您唯一的其他真正选择是将代码从数据库写入文件然后include 它,但我认为这将是一个比仅使用evaluate() 更糟糕的解决方案。

很多人都沉迷于 evaluate() 不好的教条,没有真正停下来思考为什么会这样......对于大多数情况下人们使用它是不必要的,但在以下情况下完全没问题它是需要的(比如你的)。

【讨论】:

  • 实际上,我有很多看起来像报告的页面。这些页面有很多列标题。我将变量名称存储在数据库中以控制列标题的数量。例如:第 1 列需要根据应用程序中的值显示(如 application.showColumn1)。所以我将列名存储在 db 中,另一个字段存储条件。
【解决方案2】:

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

在很多情况下,数组表示法是你的好朋友

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

请注意,查询名没有被引用,但字段名被引用。如果您不引用字段名,ColdFusion 将假定它是一个变量。

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

在您的情况下,您将变量名称存储在数据库中。如果使用 evaluate 可以为您提供正确的结果,那么您所做的任何更改都可能会变得更糟。

【讨论】:

  • 这是不正确的 - 看来您(和支持者)还没有阅读 "此列中的值可以是..." 部分;您正在回答与所问问题不同的问题。
【解决方案3】:

数据库中有多少种独特的组合?是否会在没有开发人员交互的情况下显示新值?

如果有合理数量的可能值不变,则使用 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

【讨论】:

    【解决方案4】:

    如果我没看错的话,你不仅仅是在数据库中存储变量名,而是实际的 sn-ps 代码,例如 [isDefined(session.it_user_id)]。

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

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

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

    【讨论】:

    • 实际上,我有很多看起来像报告的页面。这些页面有很多列标题。我将变量名称存储在数据库中以控制列标题的数量。例如:第 1 列需要根据应用程序中的值显示(如 application.showColumn1)。所以我将列名存储在 db 中,另一个字段存储条件。改变方法现在不可行,因为我已经这样做了很长时间,并且有很多这样的页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多