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, ',')#">

私が試したテストデータには「PTI19-1」と「PTI19-1、PTI 19-2」が含まれているため、リストの項目数に関係なく問題が発生します。引用符がない、または誤用しているだけですか?

編集:私のテストサーバーでCF9を実行し、本番サーバーでCF8を実行します。<cfdump>タグを使用して、データが期待どおりであることを確認しました。

4

1 に答える 1

3

cfloopがlist属性でどのように機能するかを誤解しています。値はインデックスに含まれているため、ListGetAtは必要ありません。

(技術的にはこれは正確ではありません-それはitemあなたが得ているものだからですが、最初にcfloopを実装した人は誰でもこの方法でそれを行い、私たちはそれに固執しています。)

また、リストは変数名ではなく文字列でなければならないため、変数を1つに評価するにはハッシュが必要であることに注意してください。

最後に、リストを一度に1つの項目でループしているため、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 に答える