2

私は仕事のために少しの申し込みをしています、そしてそれはフォームを含みます。フォームを使用している人がデータ型「数値」(PIN番号など)に値を入力しない場合、または「日付」データ型フィールドの1つ(記念日など)に日付を入力しない場合は、私に返されます。次のようなエラーがあります:

エラータイプ–タイプd'erreur _Microsoft OLE DB Provider for ODBC Drivers(0x80004005)_ エラー:タイプnumericの無効な入力構文: ""; クエリの実行中にエラーが発生しました

エラータイプ–タイプd'erreur _Microsoft OLE DB Provider for ODBC Drivers(0x80004005)_ ERROR:構文エラー「)」またはその近く。クエリの実行中にエラーが発生しました

したがって、フォームを使用している人が何も入力しないと、「」である文字列「空」が返されるようです。数値型とデータ型がそれをNULLエントリとして読み取れないのはなぜですか?これらのフィールドは必須ではないため、空白にする必要があります。

どうすればそれを可能にできますか?ユーザーがこれらのフィールドに何も入力しないときに、テーブルがこのエラーを表示するための空白のケースで埋められるように、「数値」型と「日付」型を使い続ける方法はありますか?

これが私のsqlステートメントです:

trsConn.EXECUTE "INSERT INTO ""TRS"".employeetbl ( "& _
  """firstName"", " & _  
  """lastName"" , " & _  
  """detContract"", " & _  
  "sle, " & _  
  """posNumber"" "& _  
  ") VALUES (" & _  
  "'" & Request.Form("empFirst") & "', " & _**  
  "'" & Replace(Request.Form("empLast"), "'", "`") & "', " & _  
  "'" & Request.Form("dateContract") & "', " & _
  "'" & Request.Form("sle") & "', " & _  
  "'" & Request.Form("posNum") & "');"  

(posNumとdateContractは、どちらもそれぞれ「numeric」と「date」のタイプです。

助けてくれてありがとう。あなたの天才が言わなければならないことを聞くのを楽しみにしています。

4

1 に答える 1

5

SQLでのNULLの概念はかなり混乱していて一貫性がありません...しかし、それが。とは異なること''は非常に明白ですNULL

''ではなくNULL''空の文字列です。日付や数値などに変換することはできません。

regress=# SELECT CAST('' AS DATE);
ERROR:  invalid input syntax for type date: ""
LINE 1: SELECT CAST('' AS DATE);
                    ^
regress=# SELECT CAST('' AS NUMERIC);
ERROR:  invalid input syntax for type numeric: ""
LINE 1: SELECT CAST('' AS NUMERIC);
                    ^

一部の製品(特にMicrosoft Accessと古いバージョンのMySQL)は、その問題について混乱しています。NULLNULL、''は空の文字列です。それらは同じものではありません。一方を他方に変換することはできません。

したがって、フォームを使用している人が何も入力しないと、「」である文字列「空」が返されるようです。数値型とデータ型がそれをNULLエントリとして読み取れないのはなぜですか?これらのフィールドは必須ではないため、空白にする必要があります。

それがアプリケーションの仕事です。アプリは、数値や日付などのフォームフィールドに空の文字列が入力されていることを確認するとNULL、ではなくデータベースに送信する必要があります''。これは通常、データベースに提供される前にユーザー入力からデータを変換する日常的な部分です。そのような変換を行うことが重要です。ユーザーからデータベースに直接値を送信するだけではいけません。

クイック検索は、aspclassicがnullまたはundefinedそのnull値として使用することを示唆しています。何かがnullの場合、それらを準備済みステートメントに渡すことができるはずです。

エラーの後に構文エラーが発生するという事実は、プレースホルダー付きのプリペアドステートメントを''使用せずに、SQLステートメントを文字列として構築していることを示しています。(SOの質問を参照してくれたJayCに感謝します)。これはSQLインジェクションを懇願しています; 言い換えれば、アプリケーションは非常に安全ではありません。ユーザーが「日付」を入力するとどうなるか想像してみてください。

2012-01-01'); DROP SCHEMA public;--

そしてあなたのアプリはそれを喜んでに変えます

INSERT INTO sometable (blah, blah, blah) VALUES (1, 2, DATE '2012-01-01'); DROP SCHEMA public;--');

その後DROP SCHEMA、陽気に実行され、フープ、スプラット、データベースがあります。これは、最も愚かで最も単純な種類のSQLインジェクション攻撃でもあります。

于 2012-08-14T04:06:44.940 に答える