我有一个页面,其中包含可变数量的输入字段(此数量的字段保存在数据库中)。提交后,这些字段中的信息将保存到数据库中。字段的名称循环,当前循环编号附加到字段的末尾。然后我将其保存到变量中并在查询中使用该变量。它从变量中获取正确的信息,但实际上并未对表单字段进行评估。例如,放入表单字段的值为:
"#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>
我需要做什么才能真正将表单变量保存到数据库中?
答案 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_1
,test_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#'>
不完整。您必须考虑如何处理空字符串,不同的数据类型等。