Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL/SQL中,是否可以使用参数作为字段/列名?_Mysql_Sql_Asp Classic - Fatal编程技术网

在MySQL/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

我正在尝试将一些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注入中保护它。

通常,子句
中的'user\u id'='1'和user\u environment=2

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

  • 抽象字符串“user_id”等于抽象字符串“1”(FALSE)
  • user_environment=2(根据数据的不同,可以为真,也可以为假)
  • 运算符要求两个条件都为TRUE,这是FALSE,因为1
  • 只有当存在AND或“user\u id”=“user\u 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   
    
    您可以再次检查哪个值不是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

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

  • 抽象字符串“user_id”等于抽象字符串“1”(FALSE)
  • user_environment=2(根据数据的不同,可以为真,也可以为假)
  • 运算符要求两个条件都为TRUE,这是FALSE,因为1
  • 只有当存在AND或“user\u id”=“user\u 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   
    
    您可以再次检查哪个值不是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是的,那么我错过了什么?