我有一组单选按钮,我想在服务器端验证。首先,我创建了具有键的参数名称的结构。然后将每个名称设置为单选按钮可以具有的不同值。这是一个例子:
<cfargument name="frmhs_rad1" type="string" required="false" default="">
<cfargument name="frmhs_rad2" type="string" required="false" default="">
<cfargument name="frmhs_rad3" type="string" required="false" default="">
<cfset validateRadio = {
frmhs_rad1 = 0,
frmhs_rad1 = 1,
frmhs_rad2 = 0,
frmhs_rad2 = 1,
frmhs_rad2 = 2,
frmhs_rad3 = 0,
frmhs_rad3 = 1,
frmhs_rad3 = 2
}>
以下是我的cfqueryparam
行之一的示例:
<cfqueryparam value="#trim(structKeyExists(validateRadio, arguments.frmhs_rad1) ? validateRadio[arguments.frmhs_rad1]:"")#" cfsqltype="cf_sql_char" null="#yesNoFormat(!len(trim(arguments.frmhs_rad1)))#" />
如果我没有选中单选按钮,我的数据库中的值将保持NULL
。如果我选中单选按钮,则会在此字段中看到空白区域。我认为我的代码应该阻止它。如果值存在,那么我检查它是否在validateRadio
结构中有效。如果值不存在,则应将其设置为NULL
。我不确定为什么我的代码失败了。任何人都可以看到我的代码的问题吗?
答案 0 :(得分:2)
我想我会看到问题的一部分,希望这会让你朝着正确的方向前进。我想您正在尝试构建一个包含单选按钮所有可能值的结构。问题是您有相同名称(键)的多个可能值。结构不支持。
您有以下代码:
validateRadio
但是如果您转储FRMHS_RAD1 1
FRMHS_RAD2 2
FRMHS_RAD3 2
结构,您将看到它只包含您为特定名称(键)设置的最后一个值。
queryparam
其他值丢失。
接下来,我不相信你的structKeyExists(validateRadio, arguments.frmhs_rad1)
逻辑也会起作用。你有这个条件:
arguments.frmhs_rad1
在该代码中,frmhs_rad1
变量将保存单选按钮(1,2或3)的值。这些值不是您结构的关键,因此永远不会找到它们。您的结构的键是frmhs_rad2
,frmhs_rad3
和df = df.ix[:, [3,21:28,30:34,36:57,61:64,67:]]
。
答案 1 :(得分:2)
您是否在处理表单帖子的页面上将单选按钮默认为空白?如果未在表单上选中单选按钮,则不会发送该按钮。
尝试在处理页面的顶部添加此内容
<cfparam name="MyRadioButtonName" default="" >
只需为每个单选按钮输入一个。如果没有选中它们,它们将为空。
如果您希望未选中的单选按钮默认为零,则可以尝试:
<cfparam name="MyRadioButtonName" default="0" >
如果有效,请告诉我。
答案 2 :(得分:0)
@ Miguel-F有一个有效的点,说明为什么你创建的结构不起作用,也就是说,结构中的一个键只允许一次。我正在实施类似的东西;一个结构,其中包含每个单选按钮名称的有效值列表。下面的代码应该有足够的注释来解释它是如何工作的。如果您的目标是防止仅向您的操作页面提交垃圾邮件的表单垃圾邮件制造者,您可以考虑使用cfthrow / cfreturn而不是允许垃圾进入您的数据库。请注意,如果是这种情况,则说明cfthrow应该去哪里。
<cffunction name="myFormAction" access="public">
<cfargument name="frmhs_rad1" type="string" required="false" default="">
<cfargument name="frmhs_rad2" type="string" required="false" default="">
<cfargument name="frmhs_rad3" type="string" required="false" default="">
<!--- the keys in this struct must match keys in the arguments struct --->
<cfset local.validateRadio = {
frmhs_rad1 = "0,1"
,frmhs_rad2 = "0,1,2"
,frmhs_rad3 = "0,1,2"
}>
<!--- loop over radio button validate struct --->
<cfloop collection="#local.validateRadio#" item="local.key">
<!--- if the radio button value is not valid, set it to a empty string which will then become NULL in the cfqueryparam --->
<cfif arguments[local.key] NEQ "" && !listFind("#local.validateRadio[local.key]#", arguments[local.key])>
<!--- this could easily be a cfthrow or some other process for handling invalid data --->
<cfset arguments[local.key] = "">
</cfif>
</cfloop>
<!--- now the null argument will fire for unused or invalid radio buttons --->
<cfquery>
INSERT/UPDATE ...
<cfqueryparam value="#arguments.frmhs_rad1#" cfsqltype="cf_sql_char" null="#yesNoFormat(!len(trim(arguments.frmhs_rad1)))#" />
</cfquery>
</cffunction>