【问题标题】:How to prevent Coldfusion adding decimals to digit-only varchars?如何防止 Coldfusion 将小数添加到仅限数字的 varchars?
【发布时间】:2012-11-20 15:41:49
【问题描述】:

我正在使用Coldfusion8

我收到一个带有项目编号(随机 35 个字符字符串)的 Ajax 请求,我需要将其写入/检索到数据库中。

问题是,当我只传递如下数字时:

 23456

Coldfusion 输出接收:

 23456.0

如果字符串包含A12345 之类的任何字母,则它可以正常工作。

一些代码(虽然这并没有显示什么不工作:

Javascript:

var btn = $(this).find('input'),
    putOnRack = btn.jqmData('index'),
    form = "",
    service = "../services/handler.cfc",
    method = "process",
    returnformat = "JSON",
    targetUrl = "",
    formdata = "form_submitted=store_selection&artikelnummer="+putOnRack+"&method="+method+"&returnformat="+returnformat;

    // pass to AJAX
    ajaxFormSubmit( form, service, formdata, targetUrl, successHandler, "no", "", returnformat, "" );

var ajaxFormSubmit = 
    function ( form, service, formdata, targetUrl, successHandler, dataHandler, errorHandler, returnformat, type ){
    $.ajax({
        async: false,
        type: type == "" ? "get" : type,
        url: service,
        data: formdata,    
        dataType: returnformat,
        success: function( objResponse ){}, 
        error: function (jqXHR, XMLHttpRequest, textStatus, errorThrown) {}

在 Coldfusion 中,我通过 process 传递它,它验证并构建表单服务器端,然后我传递给我的数据库处理程序,它得到一个

 `LOCAL.form` 

包含所有传递信息的对象,所以我的项目编号将在LOCAL.form.artikelnummer

如果我输出这个:

 cfdump output="e:\dump.txt" label="catch" var="#LOCAL.form.artikelnummer#">

只有数字的字符串被视为.0

问题
在通过 AJAX 将参数传递给 Coldfusion 时,如何确保最终得到的是 varchar 而不是数字?

【问题讨论】:

  • 一些代码(虽然这并没有显示出什么不起作用:那为什么要显示呢?
  • 因为如果根本没有发布代码,你会写“显示一些代码”;-) 实际上,一旦数据从 CF 中的 AJAX“到达”,就会出现错误“.0”,所以我不确定要发布什么。

标签: ajax coldfusion decimal varchar number-formatting


【解决方案1】:

您也可以在 CF 中使用 INT 函数。

int(123.456) <!--- returns 123 --->

INT 在其他语言中类似于 floor(向下舍入)

INT()

在尝试使用 int 或 numberFormat 之前,您需要检查结果以确保它是否为数字,否则您将收到 The value cannot be converted to a number 错误。

<cfif isNumeric(yourValue)>
  <cfset yourValue = int(yourValue)>
</cfif>

【讨论】:

    【解决方案2】:

    您可以使用NumberFormat()。示例:

    NumberFormat('123.0', '99999')// returns '123'
    

    第二个参数是一个掩码,它决定了你的号码将如何显示。

    【讨论】:

    • 如果字符串可以包含字母,这是我从操作中推断出来的,你需要先运行 isNumeric()。
    【解决方案3】:

    cfquery 块中使用&lt;cfqueryparam ...&gt; 并指定CFSQLType="CF_SQL_INTEGER"。这也将防止 SQL 注入攻击(ps,您应该永远将原始数据从最终用户传递到您的数据库中)。

    推荐阅读:

    1. cfqueryparam (Coldfusion 8)
    2. Secure your ColdFusion application against SQL injection attacks

    【讨论】:

    • 嗯。但是如果我不做查询呢?我正在发送带有&amp;foo=bar 的AJAX 调用,bar 将映射到LOCAL.form.artikelnummer,然后当我输出123 时变为123.0123A 保持123A。当我在查询中使用这个值时,我当然是 cfquery-param-ing。但是,当它仍然是一个被传递的值时,我能做什么呢?
    • 好点。今晚我会再试一次。即使我将 cfqueryparam 声明为 varchar 也会出现问题,错误的 .0 将被视为 2 个字符,而应该没有。
    • 我添加了另一个可以更好地解决您的问题的答案。
    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多