ColdFusion表单不提交数据到数据库

问题描述:

我遇到了一些问题,我的ColdFusion代码, 我有一个简单的表单,我所要做的就是将值添加到数据库。我不断收到错误: “错误代码206 [Macromedia公司] [SQLServer的JDBC驱动程序] [SQLServer的]操作数类型冲突:INT与文字不兼容”ColdFusion表单不提交数据到数据库

这里是我的代码:

<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#中的单引号,我得到“无效的列名称(我输入的内容)'。”

如果数据库中的hexvalue字段是文本字段,例如为nvarchar,VARCHAR,文本,然后在你至少需要引号的变量...即

<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> 
+3

绝对在所有变量查询参数上使用cfqueryparam。那么你不需要担心数据类型转换或应该或不应该引用哪些值。此外,它对于像SQL Server这样的数据库尤其重要,因为它们支持执行多个语句,即易受sql注入影响。使用cfqueryparam意味着你正在使用[bind variables](https://en.wikipedia.org/wiki/Bind_variable),它带来了各种各样的好处,其中最重要的就是sql注入保护。 – Leigh

+0

谢谢!其他一些人提到了cfqueryparam,但我不确定如何使用它。这对我来说很有意义!谢谢! – Benjadock

+1

我用cfqueryparam替换了它们,它完美地工作,谢谢@Jedihomer Townend&@Leigh! – Benjadock

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

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

事实上,它看起来像你的ID是一个文本字段,以及。这是如何在数据库中设置的?你没有做任何验证,数值是数字....通常ID是一个自动递增字段,并且在插入时根本不由用户提供。

+6

*您需要添加引号* ...尽管你真的应该使用的是cfqueryparam ;-)它避免了引号的需要,可以提高性能,更重要的是有助于防止sql注入(你当前的查询是脆弱的)。 – Leigh