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, но я не понимаю, почему новая версия вызывает эту ошибку.
Итак, мой вопрос:
Есть ли способ каким-то образом получить эту старую версию CF? Имейте в виду, что у меня есть папка с исходным кодом CF9 на моем старом компьютере, но я не был уверен, есть ли способ, которым я могу взять исходные файлы и переместить их или вручную установить их или все входы и выходы из этого. Может ли это быть так же просто, как копирование старых исходных файлов в новый источник CF на новом сервере?
Что может быть простой альтернативой для изменения упомянутого кода? Я совершенно не знаком с 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
-включая любую из ваших переменных в этот код, что является довольно плохой формой и может привести к "неожиданному поведению" в вашем коде.