0

我有一组单选按钮,我想在服务器端进行验证。首先,我创建了具有键的参数名称的结构。然后将每个名称设置为单选按钮可以具有的不同值。这是一个例子:

<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结构中是否有效。如果 value 不存在,则应将其设置为NULL. 我不确定为什么我的代码失败了。任何人都可以看到我的代码的问题吗?

4

3 回答 3

2

我想我看到了问题的一部分,希望这会让你朝着正确的方向前进。我认为您正在尝试构建一个包含单选按钮所有可能值的结构。问题是同名(键)有多个可能的值。结构不支持这一点。

你有这个代码:

<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
}>

但是,如果您转储该validateRadio结构,您将看到它仅包含您为特定名称(键)设置的最后一个值。

FRMHS_RAD1 1  
FRMHS_RAD2 2  
FRMHS_RAD3 2  

其他值丢失。

接下来,我不相信你的queryparam逻辑也行得通。你有这个条件:

structKeyExists(validateRadio, arguments.frmhs_rad1)

在该代码中,arguments.frmhs_rad1变量将保存单选按钮的值(1、2 或 3)。这些值不是您结构的键,因此永远不会找到它们。您的结构的键是frmhs_rad1,frmhs_rad2frmhs_rad3

于 2017-09-07T17:39:40.830 回答
2

您是否将处理表单发布的页面上的单选按钮默认为空白?如果未选中表单上的单选按钮,则不会发送该单选按钮。

尝试在处理页面的顶部添加它

<cfparam name="MyRadioButtonName" default="" >

只需为每个单选按钮输入一个。如果未检查它们,它们将为空。

如果您希望未选中的单选按钮默认为零,您可以尝试以下操作:

    <cfparam name="MyRadioButtonName" default="0" >

让我知道这是否有效。

于 2017-09-07T17:41:53.210 回答
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>
于 2017-09-08T18:32:20.697 回答