2

より効率的に実行できると確信しているフォーム処理があり、結果セットにエラーがありますが、「生命を脅かす」だけでなく、正しくありません。

Bこのページの目的は、アイテムをプログラムに関連付けると同時に、プログラム内の指定を関連付けるFことです。フィールドはチェックボックスであり、アイテムを複数のプログラムおよびその特定のプログラム内の指定に関連付けることができます。(わかりやすくするために編集) 例:

アイテム:ライトセーバー

  • プログラム: ジェダイの訓練
  • 名称: ツール(b) (はい)
  • 指定: 武器(f) (いいえ)

  • プログラム:ジェダイマスター

  • 名称: ツール(b) (はい)
  • 指定: 武器(f) (はい)

  • 番組名:スマグラー

  • 名称: ツール(b) (いいえ)
  • 指定: 武器(f) (いいえ)

形:

 <form action="#CGI.SCRIPT_NAME#" method="post" name="program">
    <label>Item</label>
    <select id="item" name="item">
    <!---//loop through and display items --->
    <cfloop query="getitems">
        <option value="#itemid#">#itemname#</option>
    </cfloop>
    </select>   
    <table>
    <!---//loop through and display programs --->
    <cfloop query="getprogram">
    <tr>
    <td>#programname#</td>
    <td><input type="checkbox" id="B#programid#" name="B#programid#"></td>
    <td><input type="checkbox" id="F#programid#" name="F#programid#"></td>
    </tr>
    </cfloop>
    </table>
    <input type="submit">
    </form>

アクションページ:

<!---// is there is a form being processed --->
<cfif #CGI.REQUEST_METHOD# is 'post'>
<!---// create program list from query --->
 <cfset pl = ValueList(query.var, ','>
<!---// set addtl form var's --->
 <cfset listassid = 'form.item'>
<!---// loop over program list ---> 
 <cfloop list="#pl#" index="i">
<!---// loop over form fields --->
  <cfloop list="form.fieldnames" index="field">
   <cfif #field# EQ 'B'&#i#>
<!---// if field is B and var, set designation true --->     
    <cfset b = 1>
   <cfelse>
<!---// it's not, set to null --->
     <cfset b = 'null'>
   </cfif>
   <cfif #field# EQ 'F'&#i#>
<!---// if field is F and var, set designation true --->  
     <cfset f = 1>
   <cfelse>
<!---// it's not, set to null --->
     <cfset f = 'null'>
   </cfif>
   <cfif b EQ 'null' AND f EQ 'null'>
<!---// if both are null then skip --->   
    //do nothing
   <cfelse>
<!---//insert record into table --->
     insert into table (table fields)
     (#i#, #listassid#, #b#, #f# )
   </cfif>
  </cfloop>
 </cfloop> 
</cfif>

結果は次のようになります。

id  item_id program_id  B   F
1   24      1           x   
2   32      2           x   x

実際の結果は次のとおりです。

id  item_id program_id  B   F
1   24      1           x   
2   32      2           x   
3   32      2           x

提案できる説明と効率について、事前に感謝します。

4

1 に答える 1

0

少し異なる命名規則が現在の問題を解決し、コードの可読性を向上させるのに役立つと思います。

1 つのオプションは、非表示のフォーム フィールドにすべてのプロジェクト ID を保存することです。ID が CSV リストとして送信されるように、必ず同じ「名前」を使用してください。また、読みやすさを向上させるために、チェックボックスにはより意味のある名前を付けることをお勧めします。たとえば、「B」や「F」だけではなく、「is Something 」です。

<select id="item" name="itemID">
    <cfoutput query="getitems">
        <option value="#itemid#">#itemname#</option>
    </cfoutput>
</select>   
...
<cfoutput query="getPrograms">
    <input type="hidden" name="programIDList" value="#programID#">
    ...
    <!--- Set checkbox values to 1 / Yes --->
    <td><input type="checkbox" name="isTool_#programID#" value="1"></td>
    <td><input type="checkbox" name="isWeapon_#programID#" value="1"></td>
    ...
</cfoutput>

フォームが送信されると、プロジェクト ID のリストをループし、現在の ID を使用してチェックボックスの各セットの値を抽出します。いずれかのボックスがチェックされている場合、レコードをデータベースに挿入します。

* 注: チェックボックスは、「チェック済み」の場合にのみ送信されます。フィールドにアクセスする前に、structKeyExists を使用してフィールドが存在することを確認するか、cfparam を使用フィールドのデフォルト値を設定します。

<!--- Loop through list of available program id's --->
<cfloop list="#form.programIDList#" index="variables.programID">

    <!--- Ensure fields exist. Set default value  = 0 / No --->
    <cfparam name="form.isTool_#variables.programID#" default="0">
    <cfparam name="form.isWeapon_#variables.programID#" default="0">

    <!--- Extract the current values --->
    <cfset variables.isTool     = FORM["isTool_"& variables.programID ] >
    <cfset variables.isWeapon   = FORM["isWeapon_"& variables.programID ] >

    <!--- DEBUG ONLY: Display current values --->
    <cfoutput>
        <hr>variables.programID = #variables.programID#
        <br>variables.isTool = #variables.isTool#
        <br>variables.isWeapon = #variables.isWeapon#
        <br>form.itemID = #form.itemID#
    </cfoutput>


    <!--- If either box was checked, save to database --->
    <cfif variables.isTool || variables.isWeapon>
        ... run cfquery here 
    </cfif>

</cfloop>

データベース クエリに関する 2 つの重要な注意事項:

  • SQL で未加工のクライアント値を使用しないでください。代わりにcfqueryparamを使用してください。SQL インジェクションからデータベースを保護するのに役立ちます。また、ステートメントが複数回実行される場合のクエリ パフォーマンスも向上します (この場合のように)。

  • 複数の (関連する) クエリを実行する場合は、それらをcftransactionでラップして一貫性を確保してください。つまり、すべてのステートメントが 1 つの単位として成功または失敗します。

于 2016-06-21T18:12:14.640 に答える