Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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
Java 插入ddbb而不使用预处理语句_Java_Sql_Jdbc - Fatal编程技术网

Java 插入ddbb而不使用预处理语句

Java 插入ddbb而不使用预处理语句,java,sql,jdbc,Java,Sql,Jdbc,首先,这是我第一次使用JDBC。 我有一个名为insertQuery的方法和另一个名为updateQuery的方法,它们都接收一个字符串,以便在名为Movies的db中更新或插入新电影。因此,基于用户将通过基本UI输入的一些值,我的代码将执行一个或另一个查询。问题是我在更新时遇到语法错误,在插入时遇到23000错误,我不知道为什么 try { ResultSet rs = conn.selectQuery("SELECT title FROM movie WHERE title LIKE '

首先,这是我第一次使用JDBC。 我有一个名为insertQuery的方法和另一个名为updateQuery的方法,它们都接收一个字符串,以便在名为Movies的db中更新或插入新电影。因此,基于用户将通过基本UI输入的一些值,我的代码将执行一个或另一个查询。问题是我在更新时遇到语法错误,在插入时遇到23000错误,我不知道为什么

try {
  ResultSet rs = conn.selectQuery("SELECT title FROM movie WHERE title LIKE '" + title + "';");
  if (rs != null) {
    if (rs.next()) {
      System.out.println("Updating db...");
      conn.updateQuery("UPDATE movie SET title ='" + title 
                       + "', id_director = " + idDirector 
                       + ", year = " + year 
                       + ", duration = " + duration 
                       + ", country = '" + country 
                       + "', movie_facebook_likes = " + facebookLikes  
                       + ", imdb_score = "+ imdbScore 
                       + ", gross = " + gross 
                       + ", budget = " + budget 
                       + " WHERE title LIKE '" + title + "';");
    } else {
      System.out.println("Inserting into db...");
      conn.insertQuery("INSERT INTO movie (title, id_director, year, duration,
                       country, movie_facebook_likes, imdb_score, gross, budget) " +
                       "VALUES ('" + title + "', " + idDirector + "," + year + ", " 
                       + duration + ", " + country + ", " + facebookLikes + ", "
                       + ", " + imdbScore + ", " + gross + ", " + budget + ");");
    }
  }
} catch (SQLException e1) {
  JOptionPane.showMessageDialog(mainView, "MySQL error", "ERROR", .ERROR_MESSAGE);
}

这是我在没有准备语句的情况下在db中插入的方法:

public int adduser(String id, String nm, String pwd,String cy) {
    boolean result = false;
    int i = 0;
    try {
        Connection con=Util.getConnection();
        Statement stmt =con.createStatement();

        i = stmt.executeUpdate(
            "INSERT INTO userdata (userid,name,password,city)\n" +
            "VALUES ("+id+",'"+nm+"','"+pwd+"','"+cy+"')");
    }
    catch(Exception ex) {
        System.out.println(ex);
    }

    return i ; 
}

最好不要使用
PreparedStatement
。stacktrace会告诉您错误的详细信息。使用
e1.printStackTrace()打印stacktrace。如上所述,请务必阅读有关SQL注入的内容。如果stacktrace仍然让您感到困惑,并且假设conn对象是您定义的类的实例,请共享该类的stacktrace和源。请为此使用准备好的语句,将值连接到查询字符串会使您容易受到SQL注入的影响。当询问有关错误的问题时,请在问题中发布完整的异常堆栈跟踪。然而,原因似乎是插入中缺少
国家/地区
的引号(错误是一种“相对良性”的SQL注入形式,表明您确实应该使用准备好的语句)。您好,欢迎来到StackOverflow。我稍微整理了一下格式,使它更具可读性。虽然主要问题是如何不使用预先准备好的语句(您已经回答了),但您的代码存在潜在的SQL注入问题。我建议您在回答中添加一个警告或解决这个问题,因为存在这样的风险,即开发人员只是复制答案,然后在生产代码中使用它,而没有意识到这个问题。