3

問題に行き詰まり、誰かがそれを修正する方法についてアイデアを持っているかどうかを確認できると思いました.

基本的に、単一の変数の下に複数の値を渡し、ループを使用して個々の値を抽出し、同時に挿入したいと考えています。

たとえば、ischecked はデバイス値を渡すために使用する変数です。2 つのデバイスを選択し、[送信] を押して、変数 #form.ischecked# を処理ページにダンプすると、たとえば 41,42 という値が得られます。これらの値を分割する方法が必要であり、cfloop と挿入が最適であると考えました。

それが重要な場合、これはすべてcfcで行われます。

        <cfset devicearray = ArrayNew(1)>
        <cfset temp = ArrayAppend(devicearray, #ischecked#)>
        <cfset test = ArrayToList(devicearray, ",")>
        <cfset length= ListLen(test)>\
        \\this loop takes the amount of devices selected, and outputs the length of the list. 

これを使用して、挿入ループの長さを調べます。もともと配列の長さをチェックすることもできましたが、リストを別の目的にも使用するつもりでした。

    <cfset devicetest = #form.ischecked#>

        <cfset usertest = #form.userid#>

        \\form.ischecked is the variable that contains the device IDs

        \\form.userid is the variable that contains the User IDs

        <cfquery name="loopquery" datasource="Test">
        <cfloop from="1" to="#length#" index="i">

        \\loop from 1 to "length", the number of Devices selected as specified earlier

        INSERT INTO Loan (DeviceID, UserID)
        VALUES ("#Evaluate("devicetest#i#")#","#Evaluate("userID#i#")#" )
        </cfloop>
        </cfquery>

つまり、基本的にはそこに行き詰まっています。ループは値を調べますが、デバイス テストではなく devicetest1 を探します (インデックスのため)。それぞれを個別に選択するようにします。

値にインデックス (i) を追加し、それを使用して挿入する例をいくつか見ましたが、それがどのように機能するかはよくわかりませんでした。

ありがとう、ジョーダン

4

2 に答える 2

7

あなたはこれをかなり複雑にしていると思います。以下は、フォーム変数のリストをループするために機能します。

<!--- dummy data --->
<cfset form.userid = 75>
<cfset form.ischecked = '46,47'>

<cfloop list="#form.ischecked#" index="i">  
 <cfquery name="loopquery" datasource="Test">
 INSERT INTO Loan (DeviceID, UserID)
 VALUES (
    <cfqueryparam cfsqltype="cf_sql_integer" value="#i#">,
    <cfqueryparam cfsqltype="cf_sql_integer" value="#form.userid#">
    )
 </cfquery>
</cfloop>
于 2012-12-04T20:38:25.607 に答える
2

私はポイントが何であるかを理解していませんdeviceArray。あなたform.isCheckedは、すでにデバイスIDのリストを含むリストであると言います。フォーム送信から入ってくる場合は、すでにコンマで区切られています。

listlenそのため、その長さを取得する以外に何もする必要はありません。

あなたのコードは文脈から外れているかもしれませんが、完全にするために、あなたparam form.isCheckedform.userID

<cfparam name="form.isChecked" default="">
<cfparam name="form.userID" default="">

この時点で、個人的にエラー チェックを行って、2 つの変数の長さが一致していることを確認します。

<cfif listLen(form.isChecked) NEQ listLen(form.userID)>
    <!--- abort or do something else --->
</cfif>

ループごとに個別の挿入を実際に記述する必要はありません。ほとんどのデータベースでは、1 つのステートメントで複数の行を挿入できます。form.userIDとの各値をループしているだけなので、 a を使用してデータ入力をサニタイズするform.isCheckedことができます。あなたと値が整数であると仮定したことに注意してください。必要に応じて変更してください。listGetAtcfqueryparamdeviceIduserId

<cfquery name="insert" datasource="test">
    INSERT INTO Loan (DeviceID, UserID)
    VALUES
    <cfloop from="1" to="#listLen(form.userID)#" index="i">
       <cfif i GT 1>
           ,
       </cfif>
       (
           <cfqueryparam value="#listGetAt(form.isChecked,i)#" cfsqltype="CF_SQL_INTEGER">,
           <cfqueryparam value="#listGetAt(form.userID,i)#" cfsqltype="CF_SQL_INTEGER">
       )
    </cfloop>
</cfquery>
于 2012-12-04T20:36:46.067 に答える