MySQL更新不适用于变量

时间:2018-10-25 18:35:52

标签: java mysql

基本上,当我尝试对Java中的变量使用update时,它不起作用 例如:

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' ";

感谢每一个响应

2 个答案:

答案 0 :(得分:1)

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

这是SQL注入攻击的直接路径。 而是使用带有SET Nombre=?之类的参数的预处理语句。

第二个:仅要查找查询中的问题,只需使用调试器或打印生成的update字符串,并查找与工作/硬编码版本有何不同。

仍然必须切换到带有真实代码参数的Prepared Statement

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开头

答案 1 :(得分:0)

首先,这种SQL生成将导致您进行Sql注入。您应该使用带有问号的PreparedStatement并传递变量,Java将处理这些变量以进行sql注入,检查和sql生成