【问题标题】:Coldfusion syntax - how to use EvaluateColdfusion 语法 - 如何使用 Evaluate
【发布时间】:2011-10-21 17:33:28
【问题描述】:

我正在尝试确定是否定义了具有变量名的变量。请帮助我的语法...到目前为止我的尝试:

<cfif isDefined(Evaluate("session['#url.sessionSQL#']['SQL_ALL']"))>

<cfif isDefined('Evaluate("session[#url.sessionSQL#]")["SQL_ALL"]')>

<cfif isDefined(Evaluate("session['#url.sessionSQL#']['SQL_ALL']"))>        

<cfif isDefined('session[Evaluate("#url.sessionSQL#")]["SQL_ALL"]')>

<cfif isDefined('session["#url.sessionSQL#"]["SQL_ALL"]')>

谢谢。

【问题讨论】:

    标签: coldfusion evaluate


    【解决方案1】:

    你的问题有点令人困惑;)

    如果 session[url.sessionSQL]['SQL_ALL'] 包含变量的 name,您可以使用 structKeyExists 来验证变量是否存在于特定范围内。

    <cfif structKeyExists(scopeToCheck, "TestForThisVariableName")>  
    ... ie
    <cfif structKeyExists(variables, session[url.sessionSQL].SQL_ALL)>
    

    另一方面,如果只是想验证那些会话变量是否存在

      <cfif structKeyExists(session, url.sessionSQL) AND 
            structKeyExists(session[url.sessionSQL], "SQL_ALL")>
    

    无论哪种方式,您都不需要 evaluate() 函数。

    更新:来自 cmets,IsDefinedStructKeyExists 之间的主要区别是 precision。 IsDefined 在确定变量是否存在时检查a whole list of scopes。通常(尽管并非总是如此)这是不可取的,因为如果您忘记了多个范围中存在的特定变量,它可能会导致意外结果。 (在函数中使用 IsDefined 就是一个很好的例子。)当您特别想检查多个范围时,IsDefined() 更合适。否则,我会坚持使用StructKeyExists,因为它的结果不那么模棱两可。

    【讨论】:

    • 虽然 Henry 的回答没有错,但还是支持 Leigh,因为我更喜欢 structKeyExists() 路线而不是 isDefined()。
    • &lt;cfif structKeyExists(variables, session[url.sessionSQL].SQL_ALL)&gt; 如果变量的名称是 "form.x 或只是 "x" 将不起作用,程序员不关心 x 定义的范围。因此,IsDefined() 还是更好。性能差异可以忽略不计,正确性更重要。
    • @Henry - 就潜在的正确性而言,IsDefined() 实际上是最不准确的。如果您忽略范围,则无法保证您甚至验证了正确的 x 变量。至于其余的variables 就是一个例子。这就是我指定scopeToCheck的原因。
    【解决方案2】:

    尽管 Henry 下面的答案是最好的,但我还是会指出您上面的语法存在的问题。

    您希望将 isDefined() 内部的字符串评估为字符串,但它是用引号引起来的(这当然是 isDefined() 所必需的,因为它需要变量的名称,而不是实际变量。所以你需要使评估()在引号内运行的哈希标记。

    <cfif isDefined('#Evaluate("session[url.sessionSQL]")#["SQL_ALL"]')>
    

    否则它正在寻找一个名为“session[#url.sessionSQL#]”)["SQL_ALL"]"的变量

    我实际上并没有对此进行测试,但我相信这应该可行。但显然,另一种方式要好得多。

    【讨论】:

      【解决方案3】:
      <cfif isDefined("#session[url.sessionSQL].SQL_ALL#")>
      

      更新

      假设您要检查的变量的名称存储在session[url.sessionSQL].SQL_ALL 中,但这些片段可能尚未在urlsessionSQL_ALL 中定义

      那么最安全的版本:

      <cfif isDefined("url.sessionSQL") 
            and isDefined("session[url.sessionSQL]")
            and isDefined("session[url.sessionSQL].SQL_ALL")
            and isDefined("#session[url.sessionSQL].SQL_ALL#")>
      

      【讨论】:

      • Henry 指出的方式是最好的处理方式。很少有充分的理由再使用 evaluate()。
      • 嗯...试过了,但无法正常工作。如果我在示例中不清楚,#url.sessionSQL# 和 #session# 都是变量,而 'SQL_ALL' 不是。
      • 也许检查url.sessionSQL是否定义,session[url.sessionSQL]是否定义,session[url.sessionSQL].SQL_ALL是否先定义?
      【解决方案4】:

      编辑:

      事实证明,上述 Leigh 的回答很好,但 Henry 的回答不行。在此期间,我找到了自己的解决方案,如下所示。

      在最初的问题中,我有一个结构

      "#session#"
      

      有一个变量引用的元素

      "#url.sessionSQL#"
      

      换句话说,

      "#session[sessionSQL]#" 
      

      我试图找出该元素是否定义了一个名为“SQL_ALL”的 structKey。我能够让事情像这样工作:

      <cfset sessionSQL = #session[url.sessionSQL]# />
      <cfif structKeyExists(sessionSQL, "SQL_ALL")>
      

      【讨论】:

      • 只是好奇,结果与建议的示例有何不同?请记住,您始终可以发布少量数据转储。它通常有助于切入正题。尤其是动态变量...
      • 好吧,事实证明我有部分错误...... Leigh,你的答案是正确的,而 Henry 的解决方案没有奏效。不确定我是否错误地复制了您的解决方案。无论如何,我很抱歉,我投票赞成你的答案!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 2011-05-14
      相关资源
      最近更新 更多