2013-12-13 4 views
1

Я создаю сайт, на котором я следил за MVC, чтобы управлять своим кодом без использования каких-либо фреймворков. Я поставил все мои запросы внутри CFCs и я инициализирует их в моей 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().

Однако я бы предположил, что у вас нет всех переменных VARed, что означает, что они входят в область переменных CFC, которая предоставляется совместно с каждым пользователем приложения.

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

+0

Добавлен код cfc выше. Пожалуйста, проверьте, поможет ли это вам предложить – user1728565

+2

Переменная, не являющаяся должным образом var'd, является getcontactcustomerprofiledetail. –

+1

Я не уверен, что еще вы ожидаете от меня. Как я уже догадался, вы не VARing своей переменной. Итак ... мм ... ** VAR это **. –

Смежные вопросы