1

我有以下代码:

<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。我使用<cfdump>标签来验证数据是否符合我的预期,并且确实如此。

4

1 回答 1

3

您误解了 cfloop 如何与 list 属性一起使用 - 您不需要 ListGetAt 因为该值包含在索引中。

(从技术上讲,这并不准确 - 应该是item因为这就是你得到的,但最初实现 cfloop 的人是这样做的,我们一直坚持下去。)

另请注意,列表必须是一个字符串 - 而不是变量名 - 所以您需要散列来将变量评估为一个。

最后,由于您一次遍历列表一项,因此不应使用 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>

(如果您不明白为什么,请添加评论,我会尝试进一步解释。)

于 2012-09-26T14:18:43.700 回答