2

我正在为这项工作做一个小申请,其中包括一个表格。当使用表单的人没有在数据类型“数字”(比如说 PIN 码)中输入值,甚至没有在我的“日期”数据类型字段之一中输入日期(比如说他的周年纪念日)时,它会返回给我错误如下:

错误类型 – 错误类型 _Microsoft OLE DB Provider for ODBC Drivers (0x80004005)_ 错误:数字类型的输入语法无效:“”;执行查询时出错

错误类型 – 错误类型 _Microsoft OLE DB Provider for ODBC Drivers (0x80004005)_ 错误:“)”处或附近的语法错误;执行查询时出错

所以看起来当使用表单的人什么都不输入时,它返回字符串“empty”,即“”。为什么数字类型和数据类型不能将其读取为 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.

''is not NULL, it's '', 空字符串。您不能将其转换为日期、数字等:

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——对此感到困惑。NULL为NULL,''为空字符串;他们不是一回事。您不能将一个转换为另一个。

所以看起来当使用表单的人什么都不输入时,它返回字符串“empty”,即“”。为什么数字类型和数据类型不能将其读取为 NULL 条目?这些字段不是强制性的,所以有时我需要让它们为空。

这是您的应用程序的工作。当您的应用程序看到空字符串出现在数字、日期或类似的表单字段中时,它应该发送NULL到数据库,而不是''. 这通常是在将数据提供给数据库之前从用户输入转换数据的常规部分。进行这种转换至关重要;你不应该只是将用户的值直接发送到数据库。

快速搜索表明 asp classic 使用nullorundefined作为其空值;当某些内容为空时,您应该能够将它们传递到您准备好的语句中。

在错误之后出现语法错误的事实''表明您正在将 SQL 语句构建为字符串,而不是使用带有 placeholders 的准备好的语句。(感谢 JayC 的 SO 问题参考)。这是在乞求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 回答