0

そのように生成される動的チェックボックスがあります

  <cfset counter = 0>
     <form name="setPermissions" class="setPermissions" action="" method="post">
     <cfoutput>
          <cfloop query="getUserAccess">
              <input name="Meetings_#Counter#" type="checkbox" />
              <cfset counter = counter + 1>
          </cfloop>
      </cfoutput>
      </form>

getUserAccessクエリには6行あります。つまり、これらのチェックボックスのうち6つが出力されます。

これらを読み、テーブルをそれぞれ更新するために、次のクエリを実行しています

<cfloop from="0" to="#getUserAccess.RecordCount#" index="i">
   <cfquery datasource="#Request.dsn#">
        UPDATE table SET 
            <cfif structKeyExists(FORM, 'Meetings_#i#')>
            Meetings = <cfif FORM['Meetings_#i#'] EQ "on">1,<cfelse>0,</cfif>
            </cfif>
        WHERE ID = '#an_ID_that_is_specified#'
   </cfquery>
</cfloop>

このコードが正しくない場合は、ページで実行すると機能しますが、これらのチェックボックスが約20個生成されているため、コードを切り取って1つしか表示されないようにしました。

これで、このコードはうまく機能します。チェックボックスをオンにしてフォームを送信すると、このコードはデータベースを更新して値を1に設定します。

唯一の問題は、チェックボックスをオフにしても、値が0に変更されないことです。これは私が立ち往生している場所です。onフォーム値が指定されていないのに、値を0に変更しないのはなぜですか?

私は<cfdump>何かがまだ渡されているかどうかを確認するために行いましたが、ありません。

すべてのボックスにチェックマークを付けると、このダンプが表示されます

MEETINGS_0   on
MEETINGS_1   on
MEETINGS_2   on
MEETINGS_3   on
MEETINGS_4   on
MEETINGS_5   on

いくつかチェックされているので、私がチェックしていないものは表示されません。

ただし、値はまだ1から0に更新されていません。

4

2 に答える 2

4

チェックボックスをオフにすると、チェックボックスは値を送信しません(これが機能します)。したがって、クエリはこれに近くなるはずです。

UPDATE table SET 
    Meetings = <cfif structKeyExists(FORM, 'Meetings_#i#')>1,<cfelse>0,</cfif>
WHERE ID = '#an_ID_that_is_specified#'
于 2012-09-18T11:15:30.237 に答える
0

Sergiiはすでに元の質問に答えています。しかし、そこに別のアプローチを投げるだけです...

リストを使用することもできます。IDが数値であると仮定して、すべてのチェックボックスに同じ名前を付け、元のIDを非表示フィールドに保存します。

    <cfoutput query="getUserAccess">
        #meetingID# 
        <input name="SelectedMeetings" type="checkbox" value="#meetingID#" />
    </cfoutput>
    <cfoutput>
        <input name="OriginalMeetings" type="hidden" value="#valueList(getUserAccess.meetingID)#" />
    </cfoutput>



アクションページFORM.SelectedMeetingsには、選択されたすべてのIDのリストが含まれます。2つのリストの違いを調べて、「選択解除」されたIDを見つけてください。

    <cfparam name="FORM.SelectedMeetings" default="" / >
    <cfset FORM.DeSelectedMeetings = replaceList( FORM.OriginalMeetings
                                                 , FORM.SelectedMeetings
                                                 , "") />

その場合、データベースを更新するために必要なクエリは、6つではなく2つだけです(または、チェックボックスがいくつもあります)。明らかに、どちらの方法を選択する場合でも、すべてのクエリをトランザクションでラップして、すべてが一緒に成功または失敗するようにする必要があります。

<cfif listLen(trim(FORM.selectedMeetings))>
   <cfquery datasource="#Request.dsn#">
        UPDATE table 
        SET    Meetings  = 1
        WHERE  ID IN ( 
             <cfqueryparam value="#FORM.selectedMeetings#" list="true" cfsqltype="cf_sql_integer"> 
        )
   </cfquery>
</cfif>

<cfif listLen(trim(FORM.DeSelectedMeetings))>
   <cfquery datasource="#Request.dsn#">
        UPDATE table 
        SET    Meetings  = 0
        WHERE  ID IN ( 
             <cfqueryparam value="#FORM.DeSelectedMeetings#" list="true" cfsqltype="cf_sql_integer"> 
        )
   </cfquery>
</cfif>
于 2012-09-20T17:05:09.903 に答える