Синтаксис Coldfusion - как использовать Evaluate - PullRequest
2 голосов
/ 21 октября 2011

Я пытаюсь определить, определена ли переменная с именем переменной. Пожалуйста, помогите с моим синтаксисом ... мои попытки до сих пор:

<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 ]

5 голосов
/ 21 октября 2011

Ваш вопрос немного сбивает с толку;)

Если сессия [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")>

В любом случае, вам не нужна функцияvalu ().

Обновление: Из комментариев ключевое различие между IsDefined и StructKeyExists составляет точность . IsDefined проверяет целый список областей действия при определении, существует ли переменная. Обычно (хотя и не всегда) это нежелательно, поскольку может привести к неожиданным результатам, если вы забудете, что конкретная переменная существует в нескольких областях. (Использование IsDefined внутри функции является ярким примером.) Если вы специально хотите проверить несколько областей действия, тогда IsDefined() более уместно. В противном случае я бы придерживался StructKeyExists, так как его результаты менее неоднозначны.

0 голосов
/ 24 октября 2011

РЕДАКТИРОВАТЬ:

Как оказалось, ответ Ли выше работает просто отлично, но не Генри.Тем временем я нашел свое собственное решение следующим образом.

В исходном вопросе у меня была структура

"#session#"

, в которой был элемент, на который ссылалась переменная

"#url.sessionSQL#"

другими словами,

"#session[sessionSQL]#" 

, и я пытался выяснить, был ли для этого элемента определен structKey с именем «SQL_ALL».Я смог заставить вещи работать так:

<cfset sessionSQL = #session[url.sessionSQL]# />
<cfif structKeyExists(sessionSQL, "SQL_ALL")>
0 голосов
/ 21 октября 2011

Несмотря на то, что ответ ниже от Генри является лучшим, я укажу на проблему с вашим синтаксисом выше.

Вы хотите, чтобы строка внутри isDefined () была оценена как строка, но она в кавычках (что, конечно, требуется для isDefined (), потому что она ожидает имя переменной, а не фактическую переменную. Так что вам нужно хэш-метки, чтобы сделать execute () внутри кавычек.

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

В противном случае он ищет переменную с именем "session [# url.sessionSQL #]") ["SQL_ALL"] "

Я на самом деле не проверял это, но я считаю, что это должно работать. Но ясно, что другой путь НАМНОГО лучше.

0 голосов
/ 21 октября 2011
<cfif isDefined("#session[url.sessionSQL].SQL_ALL#")>

update

Предполагается, что имя переменной, которую вы хотите проверить, хранится в session[url.sessionSQL].SQL_ALL, но части, возможно, не были определены ни в url, ни session ни в 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#")>
...