2015-03-20 3 views
1

Можно ли определить переменную сеанса, используя другую переменную в качестве имени переменной сеанса? Я не нашел ничего об этой ситуации при исследовании того, как определить переменную сеанса.Могу ли я использовать переменную в качестве имени переменной при определении переменной сеанса?

Я новичок пользователя CFML, и вот ситуация, которую я пытаюсь настроить. Надеюсь, это не слишком многословно и сбивает с толку.

У меня есть код на каждой странице, который снимает мне уведомление по электронной почте, когда данный пользователь сайта обращается к определенной странице во время сеанса пользователя. Работает отлично. Но я хочу, чтобы это сообщение электронной почты вызывало только времени, когда пользователь обращается к странице - мне не нужны дополнительные посещения страниц этой страницей этим пользователем во время сеанса этого пользователя.

Мне нужно определить переменную сеанса, уникальную для комбинации «этот пользователь/эта страница». Всякий раз, когда любой пользователь обращается к этой странице, я ищу эту переменную. Если есть совпадение, это означает, что пользователь уже посетил эту страницу во время этого сеанса пользователя, и я не запускаю оповещение по электронной почте.

Для части «этого пользователя» я уже определил переменную сеанса для пользователя, когда пользователь вошел в систему (Session.Name).

Для «что страница», то я уже однозначно определяют переменную в верхней части каждой страницы - например

<cfset page_filename = 'index.cfm'> 

Conundrum: Как совместить обе части (имя и page_filename) в одной уникальной сессии переменная, когда одна из двух частей (page_filename) сама является переменной.

До сих пор, я попытался определение «Session.page_alert» с помощью page_filename с session.name

<cfset Session.page_alert = '#page_filename##Session.Name#'> 

Но это становится бесполезным, как только посещения пользователей другой страницы, так как # page_filename # части отличается от каждой страницы, поэтому уникальная переменная сеанса относится к странице , а не к , предшествующей странице. Если пользователь возвращается к предыдущей странице, переменная Session больше не ссылается на нее, поэтому она выглядит так, как будто пользователь снова посещает эту первую страницу, даже когда пользователь уже был там.

В идеале я хотел бы сделать что-то вроде

<cfset Session.#page_filename# = '#page_filename##Session.Name#'> 

- это будет уникальная комбинация, которая будет сохраняться в течение сеанса пользователя. Но, CFML barfs, когда я это делаю, вероятно потому, что я определяю переменную сессии как переменную. Не хватает ли я очевидного решения того, что я хочу сделать? Надеюсь, это не слишком смущает. Большое вам спасибо за любую помощь, которую вы можете предоставить!

======================================================================================================================== ================= `

<!--- username variable Session.Name is defined upon user login ---> 

<!--- do a test display for existence of this variable ---> 
<cfoutput> 
<p>SESSION.NAME = #Session.Name# 
</cfoutput> 
<!--- this part works fine ---> 

<!--- define page_filename local variable at top of each page ---> 
<cfset page_filename = 'index.cfm'><!--- example for one page ---> 

<!--- do a test display for existence of this variable ---> 
<cfoutput> 
<p>PAGE_FILENAME = #page_filename# 
</cfoutput> 
<!--- this part works fine ---> 

<!--- attempt to define session variable using the page_filename variable defined above ---> 
<cfset Session[page_filename] = '#page_filename##Session.Name#'> 

<!--- test display after attempt to define session variable ---> 
<cfoutput> 
<p>SESSION.PAGE_FILENAME = #Session.page_filename# 
</cfoutput> 
<!--- this produces a CF error msg stating that "page_filename is undefined in Session" --->` 
+0

Можно есть более простые способы подойти к этому с помощью onRequestStart в Application.cfc * RE: когда пользователь данного сайта обращается к определенной странице во время сеанса пользователя * Одна конкретная страница или все страницы? Если это последнее, мне интересно узнать о вашем случае использования ... – Leigh

ответ

5
<cfset Session[page_filename] = '#page_filename##Session.Name#'> 

Update Вот модификация кода с Request рамки в месте для Session области. Пожалуйста, сравните это с тем, что у вас есть, изменив код на Session.

<!--- username variable Session.Name is defined upon user login ---> 

<cfset request.Name = "Username Foo"> 

<!--- do a test display for existence of this variable ---> 
<cfoutput> 
<p>request.NAME = #request.Name# 
</cfoutput> 
<!--- this part works fine ---> 

<!--- define page_filename local variable at top of each page ---> 
<cfset page_filename = 'index.cfm'><!--- example for one page ---> 

<!--- do a test display for existence of this variable ---> 
<cfoutput> 
<p>PAGE_FILENAME = #page_filename# 
</cfoutput> 
<!--- this part works fine ---> 

<!--- attempt to define session variable using the page_filename variable defined above ---> 
<cfset request[page_filename] = '#page_filename##request.Name#'> 

<!--- test display after attempt to define session variable ---> 
<cfoutput> 
<p>request.PAGE_FILENAME = #request[page_filename]# 
</cfoutput> 

Бегите меня на TryCF: http://trycf.com/scratch-pad/pastebin?id=W6KSYwZc

+1

И соответствующие документы: https://wikidocs.adobe.com/wiki/display/coldfusionen/Dynamic+expressions+and+dynamic+variables –

+0

Я попробовал это --- я подтвердил, что переменная page_filename существует, и переменная Session.Name существует, но не удача определяет Session.page_filename. В коде отсутствует сообщение об ошибке; он просто игнорирует это и не определяет переменную. Я что-то упускаю? – user3784919

+0

Мы не можем догадаться, как выглядит ваш код. Не описывайте это ... * опубликуйте его *. Обновите свой вопрос с помощью примера воспроизведения, демонстрирующего вашу проблему (http://sscce.org/). –

0

и вы также можете использовать

<cfset "session.#page_filename#" = "#page_filename##Session.Name#" /> 

Надеется, что это помогает!

+0

Я тоже это пробовал. Тот же результат. Я подтвердил существование переменной page_filename и переменной Session.Name, но не удастся определить Session.page_filename. В коде отсутствует сообщение об ошибке; он просто игнорирует это и не определяет переменную. Я что-то упускаю? – user3784919

4

Я думаю, чистейшее (в плане чтения кода и понимание того, что происходит) способ сделать это:

<cfset session[page_filename] = page_filename & session.Name /> 
Смежные вопросы