【问题标题】:In MySQL/SQL is it possible to use parameters as a field/column name?在 MySQL/SQL 中是否可以使用参数作为字段/列名?
【发布时间】: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


【解决方案1】:

通常,子句WHERE 'user_id' = '1' AND user_environment = 2

指示数据库返回记录,其中

  1. 抽象字符串 'user_id' 等于抽象字符串 '1' (FALSE)
  2. user_environment = 2(可以是 TRUE,也可以是 FALSE,具体取决于数据)
  3. AND 运算符要求两个条件都为 TRUE,因为 1 而为 FALSE

只有当存在 OR 而不是 AND 或 'user_id'='user_id' 时,它才可能“工作”。

您有多种选择来制作您想要的东西,最简单的方法可能是 使用 ASP 准备正确的语句,即

'statement = statement & " ? = ? " <-- comment this out

if (key="user_id" OR key="column2") then 
   statement = statement & " " & key & " = ? "
else
   Response.Write "Error"
   Response.End
end if   

所以只有当 key 是 user_id 或 column2 时它才会起作用。

另一种选择是使用其他函数定义,如

Function GetUser(environment, value1, value2, value3)
...

您可以再次检查哪个值不为空并准备所需的 WHERE 子句。

另一个想法是使用动态 WHERE 子句,即它将作为

where 
(user_id=@v1 OR @v1 IS NULL)
and (othercolumn=@v2 OR @v2 IS NULL)
...

但是如果您使用 adCmdText,这将是多余的,并且可能没有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2019-04-14
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多