ColdFusion处理表单更有效率和轻微错误

时间:2016-06-20 18:58:25

标签: forms coldfusion cfloop

我有一个表单处理,我相信它可以更有效地完成,并且结果集中有错误,尽管不是“危及生命”只是不正确。

页面的目的是将项目与程序相关联,同时在程序中关联指定 - BF字段是允许项目与之关联的复选框该特定计划内的多个计划和指定。 (为清晰起见编辑) 示例:

项目:Lightsaber

  • 计划:绝地培训
  • 指定:工具(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

提前感谢您提出的任何澄清和效率。

1 个答案:

答案 0 :(得分:0)

我认为稍微不同的命名约定有助于解决当前问题,并提高代码的可读性。

一种选择是将所有项目ID存储在隐藏的表单字段中。请务必使用相同的&#34;名称&#34;,以便将ID作为CSV列表提交。此外,我会为复选框推荐更有意义的名称,以提高可读性。例如,&#34;是 Something &#34;而不只是&#34; B&#34;或者&#34; F&#34;:

<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提取每组复选框的值。如果选中任一框,则将记录插入数据库。

*注意:复选框仅在&#34;已检查&#34;时提交。在访问该字段之前,请使用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>

关于数据库查询的两个重要说明:

  • 从不在SQL中使用原始客户端值。而是使用cfqueryparam。它有助于保护您的数据库免受SQL注入。当语句多次执行时(如本例所示)

  • ,它还可以提高查询性能
  • 执行多个(相关)查询时,请务必将其包装在cftransaction中以确保一致性,即All statements succeed or fail as a unit