2013-12-13 70 views
1

我正在构建一个网站,我跟随MVC来管理我的代码而不使用任何框架。我已经把我所有的内部氟氯化碳的查询和正在初始化他们我Application.cfm内,在应用程序变量存储它们象下面这样:用户数据越来越混乱

<cfset aplication.customerProfileObject= 
       createObject("component","cfc.customerprofile").init()> 

要执行任何查询操作,我做了一个函数,然后在任何地方调用它像这样:

<cfset selectedCustomerOb = 
     application.customerProfileObject.getContactCustomerProfileDetail(session.userid)> 

我不知道是什么导致了这个问题,但有时用户访问另一个用户的数据。这怎么可能?它是评估另一个用户的会话数据还是我初始化cfc错误?

应用程序设置是以下:

<cfapplication name="MyDataSourceName" 
      sessionmanagement="Yes" 
      setclientcookies="yes" 
      setdomaincookies="yes" 
      loginstorage="session" 
      sessiontimeout="#CreateTimeSpan(0, 2,0,0)#"> 

CustomerProfile.cfc

<cfcomponent> 
    <cffunction name="init"> 
     <cfreturn this> 
    </cffunction> 

    <cffunction name="getContactCustomerProfileDetail" returntype="query"   
      description="Returns customer contact details by contactid" 
      access="public"> 
     <cfargument name="ccId" type="numeric" required="yes"> 

     <cfquery name="getContactCustomerProfileDetail" 
        datasource="#Application.ds#" 
        dbtype="ODBC" 
        username="#Application.UserName#" 
        password="#Application.Password#"> 
      <!-------My query here---> 
     </cfquery> 

     <cfreturn getContactCustomerProfileDetail> 

    </cffunction> 

</cfcomponent> 
+2

如果'session.userid'是空白怎么办?您的CFC是否会返回第一个(也可能是全部)'customerprofile'记录? – beercodebeer

+1

你有Skyhook的代码吗?getContactCustomerProfileDetail()' –

+4

听起来像在CFC中没有适当的范围。 – ale

回答

4

正如亚当说,你需要这样做: -

<cffunction name="getContactCustomerProfileDetail" returntype="query"   
     description="Returns customer contact details by contactid" 
     access="public"> 
    <cfargument name="ccId" type="numeric" required="yes"> 

    <cfset var getContactCustomerProfileDetail = false> 

    <cfquery name="getContactCustomerProfileDetail" 
       datasource="#Application.ds#" 
       dbtype="ODBC" 
       username="#Application.UserName#" 
       password="#Application.Password#"> 
     <!-------My query here---> 
    </cfquery> 

    <cfreturn getContactCustomerProfileDetail> 

</cffunction> 

你得到这个问题的原因是因为你的CFC实例在共享范围(应用程序),并且您还没有var'd查询变量。这意味着它正在进入CFC实例的变量范围。这意味着多个线程可以覆盖此值。通过var变量,我已经显示你使该函数的局部变量,所以每个调用该函数创建一个本地化的,因此线程安全的变量。

基本上你应该把函数中的所有局部变量都作为习惯来处理。此代码永远不会在我工作的任何地方通过代码审查。

+0

好吧,我这样做,但像下面 - 它也应该工作? – user1728565

+1

是的,这将工作。这只是你必须在CF中分配一个变量。所以一切都很好,因为CFQUERY行会覆盖它。 – baynezy

3

您实际上并不包括代码的相关位来回答这个问题......这将是代码在getCustomerProfileDetail()之内。

但是我会假设你没有变量的所有变量,这意味着它们将进入CFC的变量范围,这与应用程序中的每个用户共享。

但是,正如我所说,你没有给我们正确的信息来真实地回答这个问题。我建议更新您的问题以包含相关代码。

+0

添加上面的cfc代码。请检查它是否会帮助您建议 – user1728565

+2

变量未正确变量是getcontactcustomerprofiledetail。 –

+1

我不确定你还指望我说什么。正如我猜测的那样,你不是在变量变量。所以......嗯...... ** VAR it **。 –