在定义会话变量时,我可以使用变量作为变量名吗?

时间:2015-03-20 22:09:36

标签: coldfusion

是否可以使用另一个变量作为会话变量的名称来定义会话变量?在研究如何定义会话变量时,我没有发现任何关于这种情况的信息。

我是新手CFML用户,这是我尝试设置的情况。我希望它不会太冗长和混乱。

我在每个页面上都有代码,当给定的网站用户在用户会话期间访问特定页面时,会向我发送电子邮件警报。工作良好。但是,我希望该电子邮件警报仅触发用户访问该页面的第一次时间 - 我不关心该用户在该用户会话期间对该页面的其他页面访问。

我需要定义一个对“那个用户/那个页面”组合唯一的会话变量。每当任何用户访问该页面时,我都会查找该变量。如果匹配,则表示用户在该用户会话期间已访问过该页面,并且未触发电子邮件警报。

对于“那个用户”部分,我已经为用户从用户登录时定义了一个会话变量(Session.Name)。

对于“那个页面”部分,我已经在每个页面的顶部定义了一个唯一的变量 - 例如

<cfset page_filename = 'index.cfm'>

难题:当两个部分之一(page_filename)本身是一个变量时,如何将两个部分(Name和page_filename)组合成一个唯一的会话变量。

到目前为止,我已尝试使用带有Session.Name的page_filename定义“Session.page_alert”

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

但是,一旦用户访问另一个页面,这就变得毫无用处,因为#page_filename#部分在每个页面上都不同,因此唯一的会话变量属于 new 页面,而不是上一页页面。如果用户返回上一页,则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" --->` 

3 个答案:

答案 0 :(得分:5)

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

更新以下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 :(得分:4)

我认为最干净的(在阅读代码和理解发生的事情方面)这样做的方式是:

<cfset session[page_filename] = page_filename & session.Name />

答案 2 :(得分:0)

你也可以使用

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

希望这有帮助!