Coldfusion - 尝试cfloop over query时出现复杂对象错误。版本差异?

时间:2016-03-01 16:34:29

标签: coldfusion coldfusion-9 coldfusion-2016

序言:所以我们有一些工作应用程序需要转移到新服务器,因为我们要退出旧服务器,因此我必须安装新的CF实例。

此应用程序在旧服务器上正常运行,该服务器运行ColdFusion版本" 9,0,0,251028"标准版(通过ColdFusion管理员)。

在较新的服务器上,我使用的是CF 2016版2016.0.0.298074开发者版(这是谷歌搜索中出现的第一件事,所以我选择了它)。

现在的问题是:有一段代码会出现错误:

  

无法将复杂对象类型转换为简单值。

     

表达式已请求变量或中间表达式结果作为简单值。但是,结果无法转换为简单值。简单值是字符串,数字,布尔值和日期/时间值。查询,数组和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上没有使用查询参数,但我不明白为什么因为NEWER版本会导致我这样做错误。

所以我的问题是:

  1. 有没有办法以某种方式重新获取这个旧版本的CF?请记住,我的旧计算机上有CF9源文件夹,但我不确定是否有可以获取源文件并将其移动或手动安装或者来回的来龙去脉。 。是否可以像将较旧的源文件复制到较新服务器上的新CF源一样简单?

  2. 更改提到的代码有什么简单的替代方法?我完全不熟悉CF,因为这是我在接受这份工作时继承的一个较旧的项目。我更喜欢在新系统上获得确切版本,但更改代码是唯一可行的选择。

  3. 任何见解都将受到赞赏。

    编辑:

    以下是整个违规功能:

    <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 个答案:

答案 0 :(得分: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代码中的任何变量,这是一种相当差的形式,并且可能会在代码中出现“意外行为”。