为啥 ColdFusion 认为值“7+”是一个有效的整数值,我如何验证它不是?

Posted

技术标签:

【中文标题】为啥 ColdFusion 认为值“7+”是一个有效的整数值,我如何验证它不是?【英文标题】:Why does ColdFusion think that the value "7+" is a valid integer value, and how I can validate that it is not?为什么 ColdFusion 认为值“7+”是一个有效的整数值,我如何验证它不是? 【发布时间】:2011-12-20 17:18:40 【问题描述】:

我有一个表格供用户输入数量。该表单具有客户端验证,以确保该值是一个整数并在给定范围内。操作页面具有服务器端验证,以确保该值为整数且大于零。

但是,一种类型的值通过验证并导致我的 INSERT/UPDATE 查询引发异常。该值是一个带加号的整数 - 即“7+”或“12+”。

当输入这样的值时,ColdFusion 生成的 javascript 验证会引发 JavaScript 错误:

_CF_checkformAddToCart = function(_CF_this)

    //reset on submit
    _CF_error_exists = false;
    _CF_error_messages = new Array();
    _CF_error_fields = new Object();
    _CF_FirstErrorField = null;

    //form element itemQuantity 'INTEGER' validation checks
    if (!_CF_checkinteger(_CF_this['itemQuantity'].value, false))
    
        _CF_onError(_CF_this, "itemQuantity", _CF_this['itemQuantity'].value, "Error on itemQuantity, please enter an integer value for quantity that is not greater than 500");
        _CF_error_exists = true;
    

    //form element itemQuantity 'RANGE' validation checks
    if  (!_CF_checkrange(_CF_this['itemQuantity'].value, 0.0,500.0, false))
    
        _CF_onError(_CF_this, "itemQuantity", _CF_this['itemQuantity'].value, "Error on itemQuantity, please enter an integer value for quantity that is not greater than 500");
        _CF_error_exists = true;
    

一旦我取消了错误弹出窗口,它就会进入操作页面,在那里我 [尝试] 验证值,如下所示:

<cfif IsValid("integer", form.itemQuantity) AND form.itemQuantity GT 0>
    <cfquery>
        INSERT ....

但是,如果尝试这个...

<cfset x = Int("7+") />

...ColdFusion 引发错误。

ColdFusion 是不是整数???

如何解决这个问题并正确验证我的表单输入?

【问题讨论】:

该报告JS验证错误了吗? cfform 客户端验证的 JS 升级姗姗来迟。 Henry,这是 CF 错误而不是 JS 错误。注意 isValid() 调用声称“7+”是一个整数,但显然不是。也就是说,这是一个 CF 错误! 【参考方案1】:

isNumeric(form.itemQuantity) 将为“7+”返回 false,因此要完全验证您的输入是否为 int,您可以这样做

<cfif isNumeric(form.itemQuantity) and IsValid("integer", form.itemQuantity) AND form.itemQuantity GT 0>

【讨论】:

不,但所有整数都是数字 是的,但要求它被验证为作为整数,这是 isNumeric() 无法实现的。 isNumeric() 将在 3.14 中返回 true,它不满足值是整数的要求。可以做的是 isNumeric(form.itemQuantity) && isValid("integer", form.itemQuantity) 但简单地 isNumeric() 本身并不是这个问题的有效建议。 你是对的。我已经编辑了我的答案以完全验证为数字和整数。【参考方案2】:

由于 ColdFusion 无类型的奇怪而奇妙的特性。它不知道您正在使用什么类型的数据,并试图猜测。

它评估 7+ 是有效的。 ColdFusion 内置的验证做了很多假设和猜测。

我的建议是不要使用它并编写您自己的验证例程,这些例程可以被增强以执行您需要的任何操作。

例如

用户进入

2,075

这是有效还是无效。好吧,如果你有自己的验证,你可以决定,你可以说确定这是一个整数和远程的,或者你可以说不,他们不能这样做。

这是一笔小的前期投资,从长远来看会有所回报。

【讨论】:

我同意。当涉及到类型时,ColdFusion 变得非常困惑。例如,它与 "1,2" 之类的内容非常不一致: - IsValid("integer", "1,2") // YES - IsNumeric("1,2") // NO - 传入 "1, 2" 到只接受数字参数的函数(例如 )将被允许。多么奇怪。【参考方案3】:

原来我可以使用 LSParseNumber() 将其转换为有效整数。所以,现在我正在测试一个有效的整数,然后在尝试任何数据库插入之前使用 LSParseNumber() 重置它:

<cfset addItemQty = 0 />

<cfif IsValid("integer", Trim(form.itemQuantity))>
    <cfset addItemQty = LSParseNumber(Trim(form.itemQuantity)) />
</cfif>

我想我必须重新设计前端客户端验证才能正确验证。

【讨论】:

你在使用 cfqueryparam 吗?如果是,是否允许该值?

以上是关于为啥 ColdFusion 认为值“7+”是一个有效的整数值,我如何验证它不是?的主要内容,如果未能解决你的问题,请参考以下文章

两个表查询(SQL 和 ColdFusion)中的匹配值

为啥当我在 cfoutput 中调用函数时,ColdFusion 会添加空格?

如何在 ColdFusion 中将查询列转换为列表

ColdFusion - 搜索结构数组的有效方法是啥?

如何从Array Coldfusion中删除重复值

为啥 Python 2.7.3 认为我的 .csv 文档都在一行上?