【问题标题】:ColdFusion form not submitting data to databaseColdFusion 表单未将数据提交到数据库
【发布时间】:2016-05-17 19:55:29
【问题描述】:

我的 ColdFusion 代码有问题, 我有一个简单的表单,我想做的就是将值添加到数据库中。我不断收到错误: “错误代码 206 [Macromedia][SQLServer JDBC Driver][SQLServer]操作数类型冲突:int 与文本不兼容”

这是我的代码:

    <div class="form">
    <form method="post" name="color">
        ID:
        <input type="text" name="id" id="id">
        Color Name:
        <input type="text" name="color" id="color">
        Hex Value:
        <input type="text" name="hex" id="hex">
        <input type="submit" value="Submit">
    </form>
</div>
<div>
    <cfif structKeyExists(form, "color")>
        <cfquery datasource="bentest" name="insertColor">
            USE [benTest]

            INSERT INTO color_codes
            (id ,color, hexvalue)
            VALUES
            (#form.id#, '#form.color#', #form.hex#)
        </cfquery>
        <p>You've added a color to the database!</p>
    </cfif>
</div>

如果我从#form.color# 中删除单引号,我会得到“无效的列名'(我输入的内容)'。”

【问题讨论】:

    标签: sql sql-server coldfusion


    【解决方案1】:

    如果数据库中的十六进制值字段是文本字段,例如nvarchar、varchar、text,那么您至少需要在变量周围加上引号......即

    <cfquery datasource="bentest" name="insertColor">
        USE [benTest]
    
        INSERT INTO color_codes (id ,color, hexvalue)
        VALUES (#form.id#, '#form.color#', '#form.hex#')
    </cfquery>
    

    但是我强烈建议您也使用 cfqueryparam 它们,即

    <cfquery datasource="bentest" name="insertColor">
        USE [benTest]
    
        insert into 
           [color_codes] (
              [Id], 
              [Color], 
              [HexValue]
        )
        values (
            <cfqueryparam value="#Form.Id#" cfquerytype="cf_sql_integer">,
            <cfqueryparam value="#Form.Color#" cfquerytype="cf_sql_varchar">,
            <cfqueryparam value="#Form.Hex#" cfquerytype="cf_sql_varchar">
        )
    </cfquery>
    

    【讨论】:

    • 绝对对所有变量查询参数使用 cfqueryparam。那么您就不必担心数据类型转换或应该或不应该引用哪些值。此外,对于像 SQL Server 这样的数据库来说,这一点尤其重要,因为它们支持开箱即用的多个语句的执行,即容易受到 sql 注入的影响。使用 cfqueryparam 意味着您正在使用 bind variables,它带来了各种巨大的好处,其中最重要的一项是 sql 注入保护。
    • 谢谢!其他一些人提到了 cfqueryparam,但我不太确定如何使用它。这对我来说很有意义!谢谢!
    • 我用 cfqueryparam 替换了它们,效果很好,感谢@Jedihomer Townend 和@Leigh!
    【解决方案2】:

    您需要为#form.hex# 添加引号,因为它是一个字符串值,而不是整数:

    INSERT INTO color_codes
            (id ,color, hexvalue)
            VALUES
            (#form.id#, '#form.color#', '#form.hex#')
    

    实际上,您的 id 看起来也是一个文本字段。这是它在数据库中的设置方式吗?您没有对值是否为数字进行任何验证.... 通常,ID 是一个自动递增的字段,并且根本不是由用户在插入时提供的。

    【讨论】:

    • 您需要添加引号 ...尽管您真正应该使用的是 cfqueryparam ;-) 它避免了对引号的需求,可以提高性能,更重要的是有助于保护防止 sql 注入(您当前的查询很容易受到攻击)。
    猜你喜欢
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2021-12-14
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多