我有一个供用户输入数量的表单。表单具有客户端验证,以确保值是一个整数并且在给定范围内。操作页具有服务器端验证,以确保该值是大于零的整数。
然而,有一种类型的值通过了验证,并导致我的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??
如何绕过这个并正确验证我的表单输入?
isNumeric(form.itemQuantity)
将为"7+"返回false,因此为了完全验证您的输入为int,您可以这样做
<cfif isNumeric(form.itemQuantity) and IsValid("integer", form.itemQuantity) AND form.itemQuantity GT 0>
由于ColdFusion的奇怪和奇妙的性质是无类型的。它不知道你正在处理什么类型的数据,它试图猜测。
它求出7+是有效的。ColdFusion内置的验证做了很多假设和猜测。
我的建议是不要使用它,而是编写自己的验证例程,这些例程可以增强以完成您需要的任何操作。
例如用户输入
2075年是有效的还是无效的。如果你有你自己的验证你可以决定,你可以确定这是一个整数,然后远程,或者你可以说不,他们不能这样做。
这是一笔前期的小投资,从长远来看会有回报的。
我可以使用lsparsennumber()将其转换为有效的整数。所以,现在我正在测试一个有效的整数,然后在尝试任何数据库插入之前使用lsparsennumber()重置它:
<cfset addItemQty = 0 />
<cfif IsValid("integer", Trim(form.itemQuantity))>
<cfset addItemQty = LSParseNumber(Trim(form.itemQuantity)) />
</cfif>
我想我必须重新设计前端客户端验证来正确验证。