【发布时间】:2020-01-24 18:14:52
【问题描述】:
我正在尝试将我的一些 SQL 语句转换为使用参数而不仅仅是附加值,并且我的一些语句需要输入正在使用的列以及要查找的值。
一些示例语句将是......
SELECT * FROM users WHERE user_id = 1;
SELECT * FROM users WHERE user_environment = 2;
SELECT * FROM users WHERE user_id = 1 AND user_environment = 2;
我希望能够做类似的事情,
SELECT * FROM users WHERE ? = ?;
SELECT * FROM users WHERE ? = ? AND ? = ?;
我知道如何在其他语言中执行此操作,但是我需要在 ASP Classic 中编写此代码,而且我对参数在 ADODB.Command 中的实际工作方式不是很熟悉
这是我尝试做的一个简化函数...
Function GetUser(environment, key, value)
Dim statement, cmd
Set cmd = Server.CreateObject("ADODB.Command")
statement = "SELECT * FROM USERS WHERE "
cmd.Parameters.Append cmd.CreateParameter(, adChar, adParamInput, 50, key)
cmd.Parameters.Append cmd.CreateParameter(, adChar, adParamInput, 50, value)
statement = statement & " ? = ? "
cmd.Parameters.Append cmd.CreateParameter(, adInteger, adParamInput, , environment)
statement = statement & " AND user_environment = ?"
cmd.ActiveConnection = conn
cmd.CommandType = adCmdText
cmd.CommandTimeout = 900
cmd.CommandText = statement
Set GetUser = cmd.Execute
Set cmd = Nothing
End Function
我了解正常使用参数的时候,基本都是按照输入类型指定的格式存储值。话虽如此,据我所知,准备好的语句看起来像下面这样......
SELECT * FROM users WHERE 'user_id' = '1' AND user_environment = 2;
插入到 sql 中的语句确实有效,但是,执行时,我总是得到 0 个结果。
话虽如此,我的问题是,有没有办法实现我想要做的事情?我非常需要能够向该函数发送列名以及要找到的值,但我需要能够保护它免受 sql 注入的影响。
【问题讨论】:
-
列名不能使用
?占位符。 -
使用动态 SQL (prepared statements)。但仅在存储过程形式中,而不是在函数中。
-
请记住,PREPARE 编译和优化查询。如果它没有列名或表名,它将无法编译查询。所以不,不可能,因为你正在尝试这样做
-
@RiggsFolly Q. 是 MySQL 标记的。
-
@Akina 是的,我错过了什么?
标签: mysql sql asp-classic