在查询中使用动态变量

时间:2013-07-22 13:46:37

标签: coldfusion coldfusion-9 cfquery

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

"#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>

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

此外,当您有多个具有相同名称的列,即test_location_1test_location_2,...,location_n时,通常这是{{3} }。通常,您希望创建一个辅助表,并将重复的信息存储在行而不是列中,并返回主表。

答案 1 :(得分:-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#'>

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

相关问题