结构'with'类型''Array'中的SESSION变量

时间:2010-07-28 07:50:12

标签: coldfusion

您好我有一个名为“tsks_Session”的CFC /组件,它执行会话任务。在这个cfc / init()函数中,创建了一个包含应用程序中所需的所有变量的结构。一些变量是数组类型。

<cfcomponent  >
        <cffunction name="init">
        <cfargument name="structKey" >
        <cflock timeout="35" >
         <cfset SESSION = structNew() > 
         <cfset SESSION.bar_code = "" > 
         <cfset SESSION.price = "" >  
         <cfset SESSION.pub_date = "01/01/1900" > 
         <cfset SESSION.author = ArrayNew() >
         <cfset SESSION.title = ArrayNew() >    
         <cfset SESSION.[bar_code_subj_pric] = structNew() > <!--- key = concatanation of    
                                                             bar_code and price --->
         <cfset SESSION.[bar_code_subj_pric].author = ArrayNew() >
         <cfset SESSION.[bar_code_subj_pric].title = ArrayNew() >
        </cflock>
      </cffunction>
     <!---getter--->
     <cffunction name="getAuthor" returntype="array" access="public" output="false"> 
       <cfscript>return SESSION.author;   </cfscript> 
     </cffunction>
     <!---setter:adding the Array/"author"  to the structue/"SESSION.[bar_code_subj_pric]" --->
     <cffunction name="setAuthor" retuntype="void" access="public" output="false"> 
     <cfargument name="bar_code_subj_pric" type="string"  required="true">
     <cfargument name="author" type="array"  required="true">
     <cfset var q = "" >
     <cfparam name="author" default="" >
      <cfloop index="i" from="1" to="arrayLen(SESSION.[bar_code_subj_pric].author)">
       <cfset SESSION.author = ArrayAppend(SESSION.[bar_code_subj_pric].author,"#arguments.author#")>
      </cfloop>
     </cffunction> 

     <!---getter.title--->
     <cffunction name="gettitle" returntype="array" access="public" output="false"> 
       <cfscript>return SESSION.title;   </cfscript> 
     </cffunction>
     <!---setter:adding the Array/"title"  to the structue/"SESSION.[bar_code_subj_pric]" --->
     <cffunction name="settitle" retuntype="void" access="public" output="false"> 
     <cfargument name="bar_code_subj_pric" type="string"  required="true">
     <cfargument name="title" type="array"  required="true">
     <cfset var q = "" >
     <cfparam name="title" default="" >
      <cfloop index="i" from="1" to="arrayLen(SESSION.[bar_code_subj_pric].title)">
       <cfset SESSION.title = ArrayAppend(SESSION.[bar_code_subj_pric].title,"#arguments.title#")>
      </cfloop>
     </cffunction>  
    </cfcomponent>

1)在显示页面上,已经实现了cfc, 我创建了一个名为

的str
<cfset str[expld133] =structnew()>

当我输出函数setAuthor(“expld133”,Kelly)/ setTitle(“expld133”,33.22)时,我得到"The value that i am not passing an array type". 请告诉我什么是错的?

2)我可以创建一个名为“SESSION”的结构是否安全?

3)我在主体结构“SESSION。[bar_code_subj_pric]”中添加2个不同的数组(作者/标题)的方式有错误吗?

1 个答案:

答案 0 :(得分:3)

对于问题#1,我认为失败的行可能是这两者之一:

setAuthor("expId133", Kelly);
setTitle("expId133", 33.22);

两种方法都期望数组对象为第二个参数;但是你在第一种情况下传递一个名为“Kelly”的变量,在第二种情况下传递一个数字。如果“Kelly”应该是值,而不是变量名,则必须引用它("Kelly"而不是Kelly),但这仍然不是数组。如果你想让它成为一个包含1个字符串“Kelly”的数组,那么假设你正在使用CF8或更高版本,那么你将通过["Kelly"]

对于问题#2,你可以创建一个名为“SESSION”的变量(它将进入组件的VARIABLES范围),它是“安全的”...但我强烈建议不要它。你只是要求混淆。此外,它(结构)将不会存储在会话范围内(除非组件存储在那里)。为什么不直接使用会话范围?为什么要创建一个名为“SESSION”的新结构?

对于问题#3,我不确定这是否是有效的语法,但我猜不会。尝试以下任何一种:

SESSION[bar_code_subj_pric] = foo;

这将使用bar_code_subj_pric作为变量,其值将是结构键名。因此,如果bar_code_subj_pric的计算结果为4,则整个语句的计算结果为:session.4 = foo;

另一方面,这段代码:

SESSION.bar_code_subj_pric = foo;
//this is also equivalent to:
//SESSION["bar_code_subj_pric"] = foo;

...在SESSION结构中创建一个名为“bar_code_subj_pric”的键,其值为foo变量/ object。