2

我有一个页面,其中包含可变数量的输入字段(此数量的字段保存在数据库中)。提交后,这些字段中的信息将被保存到数据库中。循环遍历字段的名称,并将当前循环编号附加到字段的末尾。然后我将它保存到一个变量中并在查询中使用该变量。它从变量中获取正确的信息,但实际上并没有评估表单字段。例如,放入表单字段的值是:

"#FORM.TEST_LOCATION_1#=two"<br>
"#FORM.TEST_LOCATION_2#=four"<br>
"#FORM.TEST_LOCATION_3#=six"<br>
"#FORM.TEST_LOCATION_4#=eight"<br>
"#FORM.TEST_LOCATION_5#=ten"<br>
"#FORM.TEST_NAME_1#=one"<br>
"#FORM.TEST_NAME_2#=three"<br>
"#FORM.TEST_NAME_3#=five"<br>
"#FORM.TEST_NAME_4#=seven"<br>
"#FORM.TEST_NAME_5#=nine"<br>

查询中使用的变量获取:

test_location_1 = '#form.test_location_1#', test_name_1 = '#form.test_name_1#', test_location_2 = '#form.test_location_2#', test_name_2 = '#form.test_name_2#', test_location_3 = '#form.test_location_3#', test_name_3 = '#form.test_name_3#', test_location_4 = '#form.test_location_4#', test_name_4 = '#form.test_name_4#', test_location_5 = '#form.test_location_5#', test_name_5 = '#form.test_name_5#',

但不是将输入字段中实际输入的值放入数据库,而是放入:

"#form.test_location_1#"
"#form.test_location_2#"
"#form.test_location_3#"
"#form.test_name_1#"
"#form.test_name_2#"
"#form.test_name_3#"
etc

我现在使用的代码是:

 <cfset session.updque = ''>
    <cfloop from="1" to="#session.test_numfields#" index="numf">
      <cfset session.updque &= "test_location_" & #numf# &" = '##form.test_location_" & #numf# & "##', ">
      <cfset session.updque &= "test_name_" & #numf# &" = '##form.test_name_" & #numf# & "##', ">
    </cfloop>
    <cfquery DATASOURCE="#ODSN#" NAME="uptest" >  
      UPDATE redbook_test SET
        <cfoutput>#PreserveSingleQuotes(updque)#</cfoutput>
        test_date_last_mod='#datecompleted#',
        test_status='C', 
        where buildno = '#session.buildno#' 
    </CFQUERY>

我需要做什么才能将表单变量保存到数据库中?

4

2 回答 2

4

FORM是一个结构。要评估动态命名的字段,请使用关联数组表示法:

        <cfset value = FORM["test_location_" & numf]>

与您的问题没有直接关系,但您当前的查询不安全。CF 自动转义查询参数中的单引号以防止 sql 注入。PreserveSingleQuotes禁用该保护,使您的数据库处于危险之中。为避免这种风险,请始终对用户提供的值使用 cfqueryparam:

         UPDATE  Table
         SET     Column = <cfqueryparam value="#form.fieldName#" cfsqltype="...">
         WHERE   ...

此外,当您有多个具有相同名称的列时,即test_location_1, test_location_2, ... ,location_n这通常是您需要规范化表的好兆头。通常,您希望创建一个辅助表并将重复信息存储在行中,而不是列中,并带有指向主表的链接。

于 2013-07-22T15:01:35.657 回答
-1

这种语法会让你开始。

update redbook_test
set test_date_last_mod <cfqueryparam value="#test_date_last_mod#">
, test_status='C'
<cfloop list="#form.fieldnames#" index="ThisField">
<cfif left(ThisField, 5) is "test_">
, #ThisField# = <cfqueryparam value = "#form[ThisField]#">
</cfif>
</cfloop>
where buildno = <cfqueryparam value='#session.buildno#'>

它不完整。您必须考虑如何处理空字符串、不同的数据类型等。

于 2013-07-22T16:41:39.960 回答