这个问题在这里已经有答案了:
使用准备好的语句的变量列名(7个答案)
两年前关门了。
我对要发送到mysql服务器的以下语句有困难:
UPDATE abonament SET ? = '1' WHERE abonutid = ?
我将它们替换为:
ps.setString(1, "`" + (indexLunaPlatita + 1) + "`");
ps.setInt(2, selVal);
但当我运行这个程序时,我会把它放到mysql中:
''`24`' = '1' WHERE abonutid = 2'
因此,它会自动用“”包围反勾选的表达式。
需要帮忙吗?
谢谢您!
1条答案
按热度按时间ivqmmu1c1#
不能使用占位符(
?
)用于列名,仅用于值。这是一个通用规则(不限于mysql)。如果您需要根据用户输入来确定列名,请非常小心—您必须自己清理输入以避免sql注入攻击,在这种情况下,jdbc不能帮助您防止攻击。
原因
?
不适用于您的案例是因为这些参数化查询是使用准备好的语句实现的:语句被发送到数据库,进行解析、编译和可能的优化,此时不需要知道值
(准备好的语句的主要用例是通过重用已编译语句来提高性能)
然后在第二步中提供这些值,指示数据库使用这些值执行语句
然后可以发送另一组值来执行准备好的语句。
因为值直到第二步才被发送,所以它们不能用于任何决定语句真正做什么的事情(例如,它使用哪个表或列)。