Coldfusion - Сложная ошибка объекта при попытке выполнить циклический переход по запросу. Расхождение версии?

Преамбула: Итак, у нас есть несколько работающих приложений, которые нам нужно перенести на новый сервер, потому что мы удаляем старый, и в результате мне пришлось установить новый экземпляр CF.

Это приложение отлично работает на старом сервере, на котором установлена ​​стандартная версия ColdFusion "9,0,0,251028" (через Администратор ColdFusion).

На более новом сервере я использую CF 2016 версии 2016.0.0.298074 Developer edition (это первое, что появилось в поиске Google, поэтому я пошел с ним).

Теперь проблема: есть часть кода, выдающая ошибку, которая говорит:

Сложные типы объектов не могут быть преобразованы в простые значения.

Выражение запросило переменную или промежуточный результат выражения в качестве простого значения. Однако результат не может быть преобразован в простое значение. Простыми значениями являются строки, числа, логические значения и значения даты / времени. Запросы, массивы и COM-объекты являются примерами сложных значений. Наиболее вероятной причиной ошибки является то, что вы пытались использовать комплексное значение как простое. Например, вы пытались использовать переменную запроса в теге cfif.

Ошибка произошла в G:/Gumbo/components/modules/resource/ResourceAdmin.cfc: строка 282 Вызывается из G:/Gumbo/admin/modules/resource/action.cfm: строка 34 Вызывается из G:/Gumbo/admin/action.cfm: строка 19

281 cfloop query="getseq">
282 <cfif getseq.resourceCategoryID IS temp><cfset newseq = getseq.displaySeq ><cfbreak></cfif>
283 </cfloop>

Нарушающей строкой является 282. Код, о котором идет речь:

<cfloop query="getseq">
      <cfif getseq.resourceCategoryID IS temp><cfset newseq = getseq.displaySeq ><cfbreak></cfif>
</cfloop>

Из моего исследования я отметил, что очевидно, что cfloop не работает с параметрами запроса в некоторых версиях ColdFusion, но я не понимаю, почему новая версия вызывает эту ошибку.

Итак, мой вопрос:

  1. Есть ли способ каким-то образом получить эту старую версию CF? Имейте в виду, что у меня есть папка с исходным кодом CF9 на моем старом компьютере, но я не был уверен, есть ли способ, которым я могу взять исходные файлы и переместить их или вручную установить их или все входы и выходы из этого. Может ли это быть так же просто, как копирование старых исходных файлов в новый источник CF на новом сервере?

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

Любое понимание будет оценено.

РЕДАКТИРОВАТЬ:

Вот и вся оскорбительная функция:

<cffunction name="updateResource" access="public" output="false" displayname="Update a Resource">       
    <cfset VARIABLES.dateUpdated=DateAdd("d", 0, arguments.dateUpdated)>    

    <cfquery datasource="#this.datasource#">
      update md_rlm_resource
      set published=<cfqueryparam cfsqltype="cf_sql_tinyint" value="#arguments.published#">,
          resourceName=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.resourceName#">,
          resourceNumber=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.resourceNumber#">,
          resourceAuthor=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.resourceAuthor#">,
          resourceFile=<cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.resourceFile#">,
          dateUpdated=<cfqueryparam cfsqltype="cf_sql_timestamp" value="#VARIABLES.dateUpdated#">,
          shortDescription=<cfqueryparam cfsqltype="cf_sql_longvarchar" value="#arguments.shortDescription#">
      where resourceID=<cfqueryparam value="#arguments.resourceID#" cfsqltype="cf_sql_integer">
    </cfquery>    

    <cfquery name="getseq" datasource="#this.datasource#">
      select displaySeq, resourceCategoryID
      from md_rlm_resourcecategoryrel
      where resourceID=<cfqueryparam value="#arguments.resourceID#" cfsqltype="cf_sql_integer">   
    </cfquery>

    <cfquery datasource="#this.datasource#">
      delete from md_rlm_resourcecategoryrel
      where resourceID=<cfqueryparam value="#arguments.resourceID#" cfsqltype="cf_sql_integer">
    </cfquery>

    <cfif IsDefined("arguments.resourceCategoryIDs")>
      <cfset resourceCategoryID = ArrayNew(1)>
      <cfset resourceCategoryID = ListToArray(arguments.resourceCategoryIDs)>

      <cfif #ListLen(arguments.resourceCategoryIDs)# gt 1>
        <cfset tmp1 = #ArrayLen(resourceCategoryID)#>
        <cfelse>
        <cfset tmp1 = "1">
      </cfif>

      <cfloop INDEX="idx" FROM="1" TO="#tmp1#">     
        <cfset newseq = 1>

        <cfif #tmp1# gt 1>
           <cfset temp=resourceCategoryID[idx]>
        <cfelse>
           <cfset temp=resourceCategoryID>        
        </cfif>

        <cfloop query="getseq">
          <cfif getseq.resourceCategoryID IS temp><cfset newseq = getseq.displaySeq ><cfbreak></cfif>
        </cfloop>

        <cfquery datasource="#this.datasource#">
          insert into md_rlm_resourcecategoryrel
             (resourceCategoryID, resourceID, displaySeq)
          values
            (
            <cfif #tmp1# gt 1>
            <cfqueryparam CFSQLTYPE="cf_sql_integer" VALUE="#resourceCategoryID[idx]#">,
            <cfelse>
            <cfqueryparam CFSQLTYPE="cf_sql_integer" VALUE="#resourceCategoryID#">,
            </cfif>       
             <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.resourceID#">,
             <cfqueryparam cfsqltype="cf_sql_float" value="#newseq#">)
        </cfquery>
      </cfloop>   
    </cfif> 

    <cfquery datasource="#this.datasource#">
    DELETE FROM md_rlm_resourceregionrel 
    WHERE resourceID=<cfqueryparam value="#arguments.resourceid#" cfsqltype="cf_sql_integer">
    </cfquery>

    <cfloop index="regionele" list="#arguments.regionID#" delimiters=",">
        <cfquery datasource="#this.datasource#">
        INSERT INTO md_rlm_resourceregionrel (resourceID, regionID) 
        VALUES (<cfqueryparam value="#arguments.resourceid#" cfsqltype="cf_sql_integer">, #regionele#)
        </cfquery>
    </cfloop>
</cffunction>

1 ответ

Решение

Из этого:

<cfset resourceCategoryID = ListToArray(arguments.resourceCategoryIDs)>
...
<cfif #tmp1# gt 1>
    <cfset temp=resourceCategoryID[idx]>
<cfelse>
    <cfset temp=resourceCategoryID><!--- temp is now an array --->        
</cfif>

temp (ужасное имя переменной, кстати) может быть массивом.

И позже вы делаете это:

<cfif getseq.resourceCategoryID IS temp>

Вы не можете сравнивать массивы с IS оператор: IS сравнивает простые значения. Вот почему вы видите ошибку.

Кстати, ты не var-включая любую из ваших переменных в этот код, что является довольно плохой формой и может привести к "неожиданному поведению" в вашем коде.

Другие вопросы по тегам