2016-05-17 137 views
2

我遇到了一些問題,我的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#中的單引號,我得到「無效的列名稱(我輸入的內容)'。」

回答

8

如果數據庫中的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

1

您需要添加引號#form.hex#,因爲它是一個字符串值,而不是整數:

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

事實上,它看起來像你的ID是一個文本字段,以及。這是如何在數據庫中設置的?你沒有做任何驗證,數值是數字....通常ID是一個自動遞增字段,並且在插入時根本不由用戶提供。

+6

*您需要添加引號* ...儘管你真的應該使用的是cfqueryparam ;-)它避免了引號的需要,可以提高性能,更重要的是有助於防止sql注入(你當前的查詢是脆弱的)。 – Leigh