1

前文: 古いサーバーを廃止するため、新しいサーバーに移動する必要がある動作中のアプリケーションがいくつかあります。その結果、CF の新しいインスタンスをインストールする必要がありました。

このアプリケーションは、ColdFusion バージョン "9,0,0,251028" Standard エディション (ColdFusion Administrator 経由) を実行している古いサーバーで正常に動作します。

新しいサーバーでは、CF 2016 バージョン 2016.0.0.298074 開発者版を使用しています (Google 検索で最初に表示されたので、それを使用しました)。

今問題:次のようなエラーを与えるコードがあります:

複雑なオブジェクト型を単純な値に変換することはできません。

式は変数または中間式の結果を単純な値として要求しました。ただし、結果を単純な値に変換することはできません。単純な値は、文字列、数値、ブール値、および日付/時刻値です。クエリ、配列、および COM オブジェクトは、複雑な値の例です。エラーの原因として最も可能性が高いのは、複雑な値を単純な値として使用しようとしたことです。たとえば、cfif タグでクエリ変数を使用しようとしました。

エラーは G:/Gumbo/components/modules/resource/ResourceAdmin.cfc: line 282 Called from G:/Gumbo/admin/modules/resource/action.cfm: line 34 Called from 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>

私の調査によると、ColdFusion の一部のバージョンでは cfloop がクエリ パラメータで動作しないように見えますが、新しいバージョンでこのエラーが発生する理由がわかりません。

だから私の質問は:

  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>
4

1 に答える 1

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、そのコードでは変数を使用していません。これはかなり貧弱な形式であり、コードで「予期しない動作」が発生する可能性があります。

于 2016-03-02T07:53:33.020 に答える