java - Mysql 更新不适用于变量

标签 java mysql

基本上,当我尝试在 java 中使用变量更新时,它不起作用 例如:

String update = "UPDATE Clientes "
                          + "SET Nombre ='"+nombre+"' , Apellido='"+apellido+"', Telefono ='"+telefono+"' ,Calle='"+calle+"',NumeroPuerta='"+numpuerta+"' , Localidad ='"+localidad+"' "
                          + "WHERE Cedula = '"+ci+"' ";

这是行不通的,但如果我尝试相同但没有变量,它就可以工作 例如:

String update = "UPDATE Clientes "
                  + "SET Nombre ='luciano', Apellido='smith', Telefono ='111111', Calle ='avenue', NumeroPuerta = '456', Localidad='maldonado' "
                  + "WHERE Cedula = '123123' ";

感谢每一位回复

最佳答案

首先:永远不要做你现在尝试的事情:SET Nombre ='"+ nombre + "'...

这是 SQL 注入(inject)攻击的直接路径。 而是使用带有 SET Nombre=? 等参数的准备好的语句。

第二:只是为了找出查询出了什么问题,只需使用调试器或打印结果更新字符串,并找出它与工作/硬编码版本有何不同。

仍然必须切换到带有实际代码参数的准备语句

UPD:开始示例(它是纯 JDBC)

假设您已经准备好 java.sql.Connection:

    String nombre = "John";
    String apellido = "Doe";
    String cedula = "12345";

    String updQuery = "UPDATE Clientes SET Nombre = ?, Apellido=? WHERE Cedula = ?";

    PreparedStatement updStmt = myConnection.prepareStatement(updQuery);

    updStmt.setString(1, nombre);
    updStmt.setString(2, apellido);
    updStmt.setString(3, cedula);

    updStmt.execute();

在 JDBC 中需要记住的两件事(永远:-)):

  1. 无法在 SQL 查询中多次定义相同的参数。 参数只是 ? 标记,索引按照 ? 从 SQL 查询的开始到结束的显示顺序排列。
  2. 参数索引以 1 而不是 0 开头

关于java - Mysql 更新不适用于变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52996000/

相关文章:

java - 从 Java 字符串转换为 Windows-1252 格式

java - 为什么使用 String.intern() 与在 Java 中传递 String 对象会得到不同的结果?

java - 如何监控和记录构建(编译/测试)时间?

java - IntelliJ Idea突然丢失JBOSS管理端口配置

PHP和MySQL日期出现查询

php - 如何从 MYSQL 数据库中的最后 10 条记录中获取最小的 ID?

java - Android 中带动画的水平 ListView

php - HTML 表无法正确显示 MySQL 数据

php - 即使添加了主键,ON DUPLICATE KEY UPDATE 仍然会添加重复项

mysql - 如何使用通配符和空格从多个 MySQL 列中进行选择?