当前位置: 首页 > 面试题库 >

使用准备好的语句的变量列名

陆斌
2023-03-14
问题内容

我想知道是否仍然可以使用准备好的语句指定返回的列名称。

我正在使用MySQL和Java。

当我尝试时:

String columnNames="d,e,f"; //Actually from the user...
String name = "some_table"; //From user...
String query = "SELECT a,b,c,? FROM " + name + " WHERE d=?";//...
stmt = conn.prepareStatement(query);
stmt.setString(1, columnNames);
stmt.setString(2, "x");

我得到了这种类型的语句(在执行之前立即打印)。

SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'

但我希望看到:

SELECT a,b,c,d,e,f FROM some_table WHERE d='x'

我知道,我不能为表名这样做,因为讨论 这里,但不知道是否有一些方法来做到这一点对列名。

如果没有,那么我只需要尝试确保对输入进行清理,以免导致SQL注入漏洞。


问题答案:

这表明数据库设计不正确。用户不需要知道列名。创建一个实际的DB列,其中包含那些“列名”,并沿其存储数据。

无论如何,不​​,您不能将列名称设置为PreparedStatement值。您只能将列 设置为PreparedStatement

如果您想朝这个方向继续,则需要清理列名(以避免SQL
Injection
)并自己连接/构建SQL字符串。引用单独的列名,并使用String#replace()转义符在列名内进行转义。



 类似资料:
  • 问题内容: 我想知道是否仍然可以使用准备好的语句指定返回的列名。 我正在使用MySQL和Java。 当我尝试时: 我得到了这种类型的语句(在执行之前立即打印)。 我希望看到: 我知道,我不能为表名这样做,因为讨论 这里,但不知道是否有一些方法来做到这一点对列名。 如果没有,那么我将只需要尝试确保对输入进行清理,以免导致SQL注入漏洞。 问题答案: 这表明数据库设计不正确。用户不需要知道列名。创建一

  • 我有一个将列名映射到值的。要更新的列事先未知,在运行时决定。 例如< code>map = {col1: "value1 ",col2: "value2"}。 我想执行一个< code>UPDATE查询,用这些列将表更新为相应的值。我能做以下事情吗?如果没有,有没有一种优雅的方法可以不用手动构建查询?

  • 我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?

  • 问题内容: 我已经使用prepared语句将订单插入到订单表中,但是现在我想根据订单表中插入的最后一个ID将订单项插入到订单表中: 等同于使用准备好的语句? 问题答案: 如果您使用的是PDO,则为。因此,如果您的数据库句柄称为: 如果您使用的是MySQLi,则为或:

  • 问题内容: 我试图用大约50,000行10列填充Java中的resultSet,然后使用的方法将它们插入到另一个表中。 为了使过程更快,我进行了一些研究,发现在将数据读入resultSet时,fetchSize起着重要的作用。 如果fetchSize太低,可能会导致到服务器的行程过多,而fetchSize太高则会阻塞网络资源,因此我做了一些尝试,并设置了适合我的基础结构的最佳大小。 我正在阅读此r