Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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
backtick preparedStatement Java_Java_Mysql_Jdbc_Backticks - Fatal编程技术网

backtick preparedStatement Java

backtick preparedStatement Java,java,mysql,jdbc,backticks,Java,Mysql,Jdbc,Backticks,我对要发送到MySQL服务器的以下语句有困难: UPDATE abonament SET ? = '1' WHERE abonutid = ? 我将其替换为: ps.setString(1, "`" + (indexLunaPlatita + 1) + "`"); ps.setInt(2, selVal); 但当我运行该程序时,我将其输入MySQL: ''`24`' = '1' WHERE abonutid = 2' 因此,它会自动用“”包围反勾选的表达式 需要帮忙吗 谢谢大家! 不能对列

我对要发送到MySQL服务器的以下语句有困难:

UPDATE abonament SET ? = '1' WHERE abonutid = ?
我将其替换为:

ps.setString(1, "`" + (indexLunaPlatita + 1) + "`");
ps.setInt(2, selVal);
但当我运行该程序时,我将其输入MySQL:

''`24`' = '1' WHERE abonutid = 2'
因此,它会自动用“”包围反勾选的表达式

需要帮忙吗


谢谢大家!

不能对列名使用占位符(
),只能对值使用占位符。这是一条一般规则(不限于MySQL)

如果需要根据用户输入确定列名,请非常小心-您必须自己清理输入以避免SQL注入攻击,在这种情况下JDBC无法帮助您防止攻击


不适用于您的案例的原因是,这些参数化查询是使用准备好的语句实现的:

  • 语句被发送到数据库,进行解析、编译和可能的优化,此时不知道值
    • (准备好的语句的主要用例是通过重用已编译语句来提高性能)
  • 然后在第二步中提供这些值,指示数据库使用这些值执行语句
  • 然后可以发送另一组值来执行准备好的语句,例如

由于值直到第二步才被发送,因此它们不能用于确定语句真正的功能(例如,它使用的表或列)。

您不能对列名使用占位符(
),而只能对值使用占位符。这是一条一般规则(不限于MySQL)

如果需要根据用户输入确定列名,请非常小心-您必须自己清理输入以避免SQL注入攻击,在这种情况下JDBC无法帮助您防止攻击


不适用于您的案例的原因是,这些参数化查询是使用准备好的语句实现的:

  • 语句被发送到数据库,进行解析、编译和可能的优化,此时不知道值
    • (准备好的语句的主要用例是通过重用已编译语句来提高性能)
  • 然后在第二步中提供这些值,指示数据库使用这些值执行语句
  • 然后可以发送另一组值来执行准备好的语句,例如

由于值直到第二步才被发送,因此它们不能用于确定语句真正的功能(例如,它使用的表或列)。

不要使用setString,只需将它们与query@YCF_L不要连接查询,这就导致了SQL注入。你不能使用
占位符作为列名(或表名)。@dragonThinks我同意,但没有办法使用setString我已经回答了这里的某个人OP可以在他/她将列名与queryin常规准备语句连接之前检查列名,无论你的编程语言是什么,不需要你添加标点符号,他们正在做比字符串替换更复杂的事情。它们引入值。不要使用setString,只需将它们与query@YCF_L不要连接查询,这会导致SQL注入。列名(或表名)不能使用
占位符@DragonThinks我同意,但没有办法使用setString我已经回答了这里的某个人OP可以在他/她将列名与查询连接之前检查列名在通用准备语句中,无论您的编程语言如何,都不需要您添加标点符号,他们正在做比字符串替换更复杂的事情。它们引入了价值观。