ListGetAt函数返回类型转换错误
我有以下代码:ListGetAt函数返回类型转换错误,list,coldfusion,List,Coldfusion,我有以下代码: <cfif SideSell neq ""> <cftry> <cfif listlen(SideSell, ",") gt 0> <cfset sidesellvalid = true> <cfelse> <cfset sidesellvalid = false> </cfif>
<cfif SideSell neq "">
<cftry>
<cfif listlen(SideSell, ",") gt 0>
<cfset sidesellvalid = true>
<cfelse>
<cfset sidesellvalid = false>
</cfif>
<cfcatch type="any">
<cfset sidesellvalid = false>
</cfcatch>
</cftry>
<cfif sidesellvalid>
<cfset AddPartNumber = "">
<cfset AddDescription = "">
<cfset AddQuantity = "">
<cfset AddPrice = "">
<cfset OptionPrice = "">
<cfset AddItem = "">
<cfloop list="FORM.SideSell" index="SideSellListIndex" delimiters=",">
<cfquery name="qSideSellParts" datasource="Pascal">
SELECT * from Part WHERE PartNumber = <cfqueryparam cfsqltype="cf_sql_varchar" list="yes" separator="," maxlength="45" value="#ListGetAt(SideSell, SideSellListIndex, ',')#">
</cfquery>
<cfset AddPartNumber = "#qSideSellParts.PartNumber#">
<cfset AddDescription = "#qSideSellParts.SubCategory#">
<cfset AddQuantity = "1">
<cfset AddPrice = "#qSideSellParts.PartPrice1#">
<cfset OptionPrice = "0">
<cfset AddItem = "Add To Cart">
<cfinclude template="checkpart.cfm">
</cfloop>
</cfif>
</cfif>
从零件号=
然而,CF抛出了一个类型转换异常,表示
“值FORM.SideSell无法转换为数字。”
在SQL行:
SELECT * from Part WHERE PartNumber = <cfqueryparam cfsqltype="cf_sql_varchar" list="yes" separator="," maxlength="45" value="#ListGetAt(SideSell, SideSellListIndex, ',')#">
从零件号=
我尝试过的测试数据包括“PTI 19-1”和“PTI 19-1,PTI 19-2”,因此无论列表项计数如何,问题都存在。我是否只是缺少或误用了引号
编辑:在我的测试服务器上运行CF9,在生产服务器上运行CF8。我使用了
标记来验证数据是否符合我的预期,事实确实如此。您误解了cfloop如何与list属性一起工作-您不需要ListGetAt,因为该值包含在索引中
(从技术上讲,这并不准确——它应该是item
,因为这正是您得到的,但是最初实现cfloop的人就是这样做的,我们一直在使用它。)
还要注意,列表必须是字符串,而不是变量名,所以需要使用哈希将变量计算为1
最后,由于一次只循环列表中的一个项目,因此不应使用cfqueryparam的list属性-(这适用于在(x,y,z)样式查询中执行WHERE PartNumber并希望将参数视为多个值时。)
总之,您的循环应该如下所示
<cfloop list=#Form.SideSell# index="PartNumber">
<cfquery name="qSideSellParts" datasource="Pascal">
SELECT * from Part
WHERE PartNumber = <cfqueryparam cfsqltype="cf_sql_varchar" value="#PartNumber#">
</cfquery>
...
</cfloop>
从零件中选择*
其中零件号=
...
(如果您不明白原因,请添加评论,我将尝试进一步解释。)非常感谢。我忘了该值包含在索引变量中。我同意,它应该是项目
,而不是索引
!然而,错误信息具有误导性;CF不应该抱怨SideSellListIndex变量吗?它是在抱怨SideSellListIndex变量-由于list属性上缺少哈希,该变量的值是字符串“FORM.SideSell”,这就是错误报告为非数字的原因。还要注意,列表必须是字符串,而不是变量名,因此您需要哈希来将变量计算为1。不知怎么的,我完全错过了这个。如果是这种情况,那么为什么CF8文档会声明:attribute:List Description“一个列表、变量或文件名;包含一个列表?”?好问题。我不知道为什么这么说,但这是错的。list属性接受字符串值(或结果为字符串值的表达式),但不会将字符串转换为变量名或文件名。该部分试图同时解释三种不同类型的循环(list、array和file)。看起来他们把事情搞砸了。