2016-05-17 8 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#から一重引用符を削除します。「無効な列名」(入力したもの)が表示されます。あなたのidは、同様のテキストフィールドであるよう

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

実は、それが見えます:

答えて

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> 

あなたが追加する必要がある*私は強くすなわち

<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文の実行をサポートする、つまり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#ために引用符を追加する必要があります。これはデータベースにどのように設定されていますか?値が数値であることを検証していません.... IDは自動インクリメントのフィールドであり、挿入時にユーザーから全く提供されないことがよくあります。

+6

、あなたはあまりにもそれらをCFQUERYPARAM示唆しかし、引用符* ...引用符の必要性を避けるcfqueryparam ;-)を使用する必要がありますが、パフォーマンスを向上させ、さらに重要なことにSQLインジェクション(現在のクエリは脆弱です)から保護します。 – Leigh

関連する問題