在MySQL/SQL中,是否可以使用参数作为字段/列名?
我正在尝试将一些SQL语句转换为使用参数,而不是仅仅附加值,我的一些语句需要输入正在使用的列以及要查找的值 下面是一些示例语句在MySQL/SQL中,是否可以使用参数作为字段/列名?,mysql,sql,asp-classic,Mysql,Sql,Asp Classic,我正在尝试将一些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 WHE
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注入中保护它。通常,子句
中的'user\u id'='1'和user\u environment=2
指示数据库返回记录,其中
'statement = statement & " ? = ? " <-- comment this out
if (key="user_id" OR key="column2") then
statement = statement & " " & key & " = ? "
else
Response.Write "Error"
Response.End
end if
您可以再次检查哪个值不是null,并准备所需的where子句
还有一个想法是使用动态WHERE子句,即它将作为
where
(user_id=@v1 OR @v1 IS NULL)
and (othercolumn=@v2 OR @v2 IS NULL)
...
但如果您使用adCmdText,这将是过分的,并且可能毫无意义 通常,子句
中的'user\u id'=1'和user\u environment=2
指示数据库返回记录,其中
'statement = statement & " ? = ? " <-- comment this out
if (key="user_id" OR key="column2") then
statement = statement & " " & key & " = ? "
else
Response.Write "Error"
Response.End
end if
您可以再次检查哪个值不是null,并准备所需的where子句
还有一个想法是使用动态WHERE子句,即它将作为
where
(user_id=@v1 OR @v1 IS NULL)
and (othercolumn=@v2 OR @v2 IS NULL)
...
但如果您使用adCmdText,这将是过分的,并且可能毫无意义 列名不能使用
?
占位符。请使用动态SQL()。但仅以存储过程形式,而不是函数形式。请记住,准备、编译和优化查询。如果没有列名或表名,则无法编译查询。所以,不,不可能像你想做的那样it@RiggsFolly问:MySQL是否已标记。@Akina是的,那么我遗漏了什么?列名不能使用?
占位符。请使用动态SQL()。但仅以存储过程形式,而不是函数形式。请记住,准备、编译和优化查询。如果没有列名或表名,则无法编译查询。所以,不,不可能像你想做的那样it@RiggsFolly问:MySQL被标记了吗?@Akina是的,那么我错过了什么?