表单变量没有定义?

时间:2014-10-15 19:12:12

标签: coldfusion

我有一个表格,我想检查一个方框,然后从那里 记录从仅检查的记录中获取emp_id(名称="添加#cnt#")

<cfform method="post" action="approver.cfm" >   
    <cfoutput>
    <input type="hidden" name="txtTotalRecords" value="#totalEmployees.recordcount)#">
    </cfoutput>
  <table >
 .....                                                                
        <cfoutput query="totalEmployees">          
        <tr >                                            

        <cfset cnt= cnt+1>  
        <td><cfif #approver# eq 1>Yes <cfelse>No </cfif></td>
        <td><input type="checkbox"  name="add#cnt#" value="yes"></td>   
        <td><input type="hidden"  name="emp_id#cnt#" value="#emp_id#"></td>   
        </tr>
          </cfoutput> 
      <cfoutput>
      <input type="hidden" name="f_cnt" value="#cnt#">        
      </cfoutput>

        </table>

         <p><input type="submit"  name="Submit" value="submit" ></p>    
 </cfform>

为了测试目的,一旦我提交表格,我最终选择记录 我会更新一张桌子。

但是一旦我提交表单,我就会收到错误: 变量form.add1未定义。

<cfloop from="1" to ="#form.f_cnt#" index="j">
    <cfset emp_id =#evaluate("form.emp_id#j#")#>
    <cfset add =#evaluate("form.add#j#")#>
    <cfdump var=#emp_id#>
</cfloop>
    <cfif emp_id neq "" and add neq "">
       <cfquery name="output" datasource="phonelist">
          select * from employee where emp_id=#emp_id#
       </cfquery>
    </cfif>
<cfdump var=#output#>

解决此问题的最佳方法是什么?

如何选择仅经过检查的记录?

我制作了http://jsfiddle.net/j65wh9hz/以便能够查看我的所有代码。

2 个答案:

答案 0 :(得分:9)

如果未选中复选框,则不会随表单一起提交。通过执行以下操作检查其存在:

<cfloop from="1" to ="#form.f_cnt#" index="j">
   <cfif structKeyExists(form, "add#j#")>
      <cfset checkbox = form["add#j#"] />
      <!--- do stuff --->
   </cfif>
</cfif>

答案 1 :(得分:2)

为了记录,可以使用复选框。

将它们命名为具有不同值的所有相同的东西(vs将所有不同的东西命名为相同的值 - &#39;是&#39; - 正如您所做的那样。

您也不需要将变量cnt用于这样的简单查询输出,您可以使用#currentrow#,但这只是语义。

<cfform method="post" action="approver.cfm" >   
    <cfoutput>
    <input type="hidden" name="txtTotalRecords" value="#totalEmployees.recordcount)#">
    </cfoutput>
  <table >
 .....                                                                
        <cfoutput query="totalEmployees">         
        <tr >                                           

        <cfset cnt= cnt+1>  
        <td><cfif #approver# eq 1>Yes <cfelse>No </cfif></td>
        <!--- Changed the checkbox's name to AddBox and the value to #emp_id# --->
        <td><input type="checkbox"  name="AddBox" value="#emp_id#"></td>
        <!--- As a tip, field names are easier to visibly read as EmpID_#cnt# or Emp_ID_#cnt# vs Emp_id#cnt# 
            but the this field should not be needed. --->
        <td><input type="hidden"  name="emp_id#cnt#" value="#emp_id#"></td>   
        </tr>
          </cfoutput> 
      <cfoutput>
      <!--- You can remove this hidden field --->
       <input type="hidden" name="f_cnt" value="#cnt#">     
       </cfoutput>

        </table>

         <p><input type="submit"  name="Submit" value="submit" ></p>    
 </cfform>

然后,对于formprocessing。

<!--- changing the cfloop below from <cfloop from="1" to ="#form.f_cnt#" index="j"> --->
<cfloop list="#form.AddBox#" index="j">
    <!--- There's no need to use evaluat("form.#variable#"), you can use form[variable] --->
    <cfset emp_id = form["emp_id#j#"]
    <cfset add =#evaluate("form.add#j#")#>
    <cfdump var=#emp_id#>
</cfloop>
    <!--- Because this was not in the cfloop, it only processes on the last emp_id --->
    <cfif emp_id neq "" and add neq "">
       <cfquery name="output" datasource="phonelist">
          select * from employee where emp_id=#emp_id#
       </cfquery>
    </cfif>
<cfdump var=#output#>

所以我们可以像这样修复它

<!--- changing the cfloop below from <cfloop from="1" to ="#form.f_cnt#" index="j"> --->
<cfloop list="#form.AddBox#" index="j">
    <!--- There's no need to use evaluate("form.#variable#"), you can use form[variable] --->
    <cfset emp_id = form["emp_id#j#"]
    <cfset add =#evaluate("form.add#j#")#>
    <cfdump var=#emp_id#>

    <cfquery name="output" datasource="phonelist">
        select * from employee where emp_id=#emp_id#
    </cfquery>
</cfloop>
<cfdump var=#output#>

但最后,没有理由循环它,我们可以做到这一点

<cfif StructKeyExists(form,"AddBox") and len(form.addbox)>
    <cfquery name="output" datasource="phonelist">
        select * from employee where emp_id in (<cfqueryparam cfsqltype="cf_sql_int" value="#form.AddBox#" list="yes">)
    </cfquery>
    <cfdump var=#output#>
</cfif>

最后的笔记

  • 我们必须使用StructKeyExists(form,&#34; AddBox&#34;)(或isDefined(&#34; form.AddBox&#34;))来确保变量存在 - 在这种情况下,要确保至少检查一个复选框。
  • A <cfparam name="form.AddBox" default="">导致cfif StructKeyExists通过,这就是为什么len也在那里。
  • 我们可以使用sql IN语句查找表格的emp_id在复选框AddBox提供的值列表中的任何记录。
  • 这确实假设emp_id是主键。
  • CFQUERYPARAM非常重要。它阻止sql注入攻击对您的表/数据库进行意外更改。查找其他查询。
  • 最后,而不是cfif显示是或否。如果审批人总是等于0或1,则可以是#YesNoFormat(审批人)#,这是cf的内置职能之一

总之,您的最终代码可能如下所示。

(这是要使用的代码)

<cfform method="post" action="approver.cfm" >   
    <cfoutput>
    <!-- Final note, I don't think this field is needed --->
    <input type="hidden" name="txtTotalRecords" value="#totalEmployees.recordcount#">
    </cfoutput>
    <table >
 .....                                                                
        <cfoutput query="totalEmployees">         
        <tr>                                            
            <td><cfif #approver# eq 1>Yes <cfelse>No </cfif></td>
            <td><input type="checkbox"  name="AddBox" value="#emp_id#"></td>
            <td><!--- removed emp_id hidden field ---> </td>   
        </tr>
         </cfoutput>
    </table>

         <p><input type="submit"  name="Submit" value="submit" ></p>    
 </cfform>

和您的处理

也可以使用

<cfif StructKeyExists(form,"AddBox")>
    <cfquery name="output" datasource="phonelist">
        select * from employee where emp_id in (<cfqueryparam cfsqltype="cf_sql_integer" value="#form.AddBox#" list="yes">)
    </cfquery>
    <cfdump var=#output#>
</cfif>

假设您确实希望在包含审批者状态的每一行中包含数据,那么您是在正确的轨道上,您将使用类似<input type="hidden" name="Approver_#emp_id#" value="#Approver#">的语法,然后您可以像这样引用它:

(这不是代码,只是一个例子)

<cfoutput><cfloop list="#form.addbox#" index="a">
  The value of this index is #a#.<br>
  The associated approver status is #form["Approver_#a#"]#
</cfloop></cfoutput>

例如,假设您希望使用此数据来制作已批准且未获批准的已检查人员列表,且值始终为0或1(对于审批者)。

<cfset Approval0 = "">
<cfset Approval1 = "">
<cfloop list="#form.addbox#" index="a">
  <cfset appstatus = form["Approver_#a#"]>
  <cfset variables["Approval#appstatus#"] = ListAppend(variables["Approval#appstatus#"],a)>
</cfloop>
<cfoutput>
  The following employee IDs have approval status: #Approval1#<br>
  The following employee IDs do not: #Approval0#
</cfoutput>

(任何非范围变量,例如Approval0和Approval1,都放在范围&#34;变量&#34;,这是允许我使用变量[&#34; Approval#appstatus#&#34; ]而不是#Evaluate(&#34; Approval#appstatus#&#34;)#)