我有以下代码:
<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正在抛出一个类型转换异常,说
&#34;值FORM.SideSell无法转换为数字。&#34;
在SQL行:
SELECT * from Part WHERE PartNumber = <cfqueryparam cfsqltype="cf_sql_varchar" list="yes" separator="," maxlength="45" value="#ListGetAt(SideSell, SideSellListIndex, ',')#">
我试过的测试数据包括&#34; PTI 19-1&#34;和&#34; PTI 19-1,PTI 19-2&#34;所以无论列表项计数如何,问题都存在。我只是遗漏或误用引号?
编辑:在我的测试服务器上运行CF9,在生产服务器上运行CF8。我使用<cfdump>
标记来验证数据是否符合我的预期,而且确实如此。
答案 0 :(得分:3)
您误解了cfloop如何使用list属性 - 您不需要ListGetAt,因为该值包含在索引中。
(从技术上讲,这不准确 - 它应该是item
,因为那是你得到的,但是最初实施cfloop的人就是这样做的,我们已经做到了一直坚持下去。)
另请注意,list必须是字符串 - 而不是变量名称 - 因此您需要使用哈希值将变量计算为一个。
最后,既然你一次在列表中循环一个项目,那么你应该不使用cfqueryparam的list属性 - (这适用于你正在做的事情WHERE PartNumber IN (x,y,z)
样式查询并希望将参数视为多个值。)
总之,你的循环应该是这样的。
<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>
(如果您不明白原因,请添加评论,我会尝试进一步解释。)