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

新手上路,请多包涵

我想知道是否有任何方法可以使用准备好的语句指定返回的列名。

我正在使用 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 注入漏洞。

原文由 KLee1 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 525
2 个回答

这表明一个糟糕的数据库设计。用户不需要知道列名。创建一个包含这些“列名”的真实数据库列,并将数据存储在它旁边。

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

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

原文由 BalusC 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于使用 NodeJS (mysqljs/mysql) 的 MySQL 准备语句,您需要知道的是 ? 用于值,但如果您需要转义列名、表名等,请使用 ?? 相反。

像这样的东西会起作用:

 SELECT ??, ??, ?? FROM ?? WHERE ?? < ?

将值设置为 ['id', 'name', 'address', 'user', 'id', 100]

原文由 DraganescuValentin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题