我在ASP Classic中使用SQL获得了一个查询,我得到的语法如下所示:
mQry = "SELECT name FROM finals WHERE invoice_num = " &request.querystring("num") & " AND name LIKE '&" & request.querystring("nam") & "%'"
response.write("Operating Unit")
for each x in TestRally.fields
response.write(": ")
response.write(x.value) '-- got error in this area...
response.write("<br>")
next
response.write("<br>")
TestRally.MoveNext
基于上面提到的语法,对此最好的补救办法是什么.. ???
到目前为止我收到的错误信息是:
Microsoft OLE DB Provider for Oracle错误'80040e07'ORA-01722: 无效的号码
答案 0 :(得分:2)
您的代码对SQL注入攻击持开放态度,这部分是导致问题的原因:您没有验证(更不用说清理)用于制定查询的输入。
在继续之前请先查看此质量检查:What is SQL injection?
我们无法告诉您如何在不知道您使用的DBMS的情况下如何正确解决问题,但快速解决方法是:
Dim invoiceNum
invoiceNum = CInt( Request.QueryString("num") )
Dim name
name = Request.QueryString("nam")
name = Replace( name, "'", "''" )
Dim sql
sql = "SELECT name FROM finals WHERE invoice_num = " & invoiceNum & " AND name LIKE '&" & name & "%'"
答案 1 :(得分:0)
invoiceNum = CInt( Request.QueryString("num") )
可能导致溢出。
您传递的发票号对于整数来说太大了。将发票号码保存为字符串。
使用戴的代码,试试这个:
Dim invoiceNum
invoiceNum = Request.QueryString("num")
invoiceNum = Replace( invoiceNum, "'", "''")
Dim name
name = Request.QueryString("nam")
name = Replace( name, "'", "''" )
sql = "EXEC sp_executesql N'SELECT name FROM finals WHERE invoice_num = @invoice_num AND name LIKE ''&'' + @name + ''%'''"
sql = sql & ",N'@invoice_num varchar(20),@name varchar(255)',@invoice_num = '" & invoiceNum & "',@name = '" & name & "'"
答案 2 :(得分:0)
在执行上述语句之前启用sql跟踪或更好的10046跟踪,您将看到为invoice_num传入了哪个值。这将创建一个跟踪文件,详细说明所有语句及其执行方式。
另外发布表的定义方式。
答案 3 :(得分:0)
“SELECT name FROM finals WHERE invoice_num ='”&amp; request.querystring(“num”)&amp; “'和名字='”&amp; request.querystring(“nam”)&amp; “'”
这是ASP Classic中查询的正确SQL语法,而不是我在问题中提到的上述SQL查询。