3

変数名を持つ変数が定義されているかどうかを判断しようとしています。私の構文を助けてください...これまでの私の試み:

<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"]')>

ありがとう。

4

4 に答える 4

6

あなたの質問は少し混乱しています;)

session[url.sessionSQL]['SQL_ALL'] に変数の名前が含まれている場合、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() 関数は必要ありません。

更新:IsDefinedコメントから、との主な違いStructKeyExistsprecisionです。IsDefined は、変数が存在するかどうかを判断するときに、スコープのリスト全体を調べます。特定の変数が複数のスコープに存在することを忘れると、予期しない結果につながる可能性があるため、通常 (常にではありません)、これは望ましくありません。(IsDefined関数内での使用が代表的な例です。) 特に複数のスコープをチェックしたい場合は、 thenIsDefined()がより適切です。それ以外の場合はStructKeyExists、結果があいまいさが少なくなるため、そのまま使用します。

于 2011-10-21T17:57:58.273 に答える
0

編集:

結局のところ、上記のリーの答えはうまく機能しますが、ヘンリーの答えはうまくいきません。その間に、私は次のように自分自身の解決策を見つけました。

元の質問では、構造体がありました

"#session#"

変数によって参照される要素がありました

"#url.sessionSQL#"

言い換えると、

"#session[sessionSQL]#" 

その要素に「SQL_ALL」という名前のstructKeyが定義されているかどうかを調べようとしていました。私は物事をそのように機能させることができました:

<cfset sessionSQL = #session[url.sessionSQL]# />
<cfif structKeyExists(sessionSQL, "SQL_ALL")>
于 2011-10-24T17:43:16.607 に答える
0
<cfif isDefined("#session[url.sessionSQL].SQL_ALL#")>

アップデート

チェックしたい変数の名前が に格納されていると仮定しますsession[url.sessionSQL].SQL_ALLが、断片は にも にも にurlsessionにも定義されていない可能性がありますSQL_ALL

次に、最も安全なバージョン:

<cfif isDefined("url.sessionSQL") 
      and isDefined("session[url.sessionSQL]")
      and isDefined("session[url.sessionSQL].SQL_ALL")
      and isDefined("#session[url.sessionSQL].SQL_ALL#")>
于 2011-10-21T17:40:27.027 に答える
0

ヘンリーからの以下の回答が最適ですが、上記の構文の問題を指摘します。

isDefined() 内の文字列を文字列に評価する必要がありますが、引用符で囲まれています ( isDefined() には実際の変数ではなく変数の名前が必要なため、これはもちろん必要です。したがって、作成するにはハッシュマークが必要です。 evaluate() は引用符内で実行されます。

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

それ以外の場合は、"session[#url.sessionSQL#]")["SQL_ALL"]" という名前の変数を探します。

私は実際にこれをテストしませんでしたが、これはうまくいくはずです。しかし、明らかに、他の方法の方がはるかに優れています。

于 2011-10-21T17:57:47.377 に答える