Java sql查询可以手动工作,但不会';不能在java代码中执行

Java sql查询可以手动工作,但不会';不能在java代码中执行,java,sql,Java,Sql,所以我想向数据库中添加一些东西,但它不起作用,它不能this.statement.executeUpdate(sqlQuery)。如果我打印出sqlQuery并在phpMyAdmin中调用它,它就会工作 我有几次DB迭代,与此类似,工作得非常好,但这一次不是随机的 SQL查询: INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) VALUES('The Office',

所以我想向数据库中添加一些东西,但它不起作用,它不能
this.statement.executeUpdate(sqlQuery)。如果我打印出
sqlQuery
并在phpMyAdmin中调用它,它就会工作

我有几次DB迭代,与此类似,工作得非常好,但这一次不是随机的

SQL查询:

INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) 
VALUES('The Office', 'A mockumentary on a group of typical office workers, where the workday consists of ego clashes, inappropriate behavior, and tedium. Based on the hit BBC series.', 'http://ia.media-imdb.com/images/M/MV5BMTgzNjAzMDE0NF5BMl5BanBnXkFtZTcwNTEyMzM3OA@@._V1._SY317_CR9,0,214,317_.jpg', '8.9', 'http://www.imdb.com/title/tt0386676/', 'tt0386676', '2005-06-11')
代码:

编辑:

好的,从现在开始我使用PreparedStatement。 但我仍然无法执行代码。因为我没有犯错误,所以我没有办法知道。可能一个原因是我的发布日期,所以我尝试在没有它的情况下让它工作。 “ps.executeUpdate();”是代码到达的位置

public boolean insert_tvShow(TvShow tvShow) {

    boolean success = false;
    java.util.Date myDate = new java.util.Date("10/10/2009");

    try {
        String sqlString = "INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) " +
                            "VALUES(?, ?, ?, ?, ?, ?, ?)";
        PreparedStatement ps = connection.prepareStatement(sqlString);
        ps.setString(1, tvShow.getTitle()); 
        ps.setString(2, tvShow.getPlot()); 
        ps.setString(3, tvShow.getPoster()); 
        ps.setDouble(4, tvShow.getImdb_Rating()); 
        ps.setString(5, tvShow.getImdb_url()); 
        ps.setString(6, tvShow.getImdb_id());
        ps.setDate(7, new java.sql.Date(myDate.getTime()));
        ps.executeUpdate();
        connection.commit();
        success = true;
    } catch(Exception e) {
        //TODO logging
    } finally {
        try {
            connection.close();
        } catch (SQLException e) {}
    }
    return success;
}

不要这样做:

 String sqlQuery = String.format("INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) " +
                                        "VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s')",
                                        tvShow.getTitle(),
                                        plot,
                                        tvShow.getPoster(),
                                        tvShow.getImdb_Rating(),
                                        tvShow.getImdb_url(),
                                        tvShow.getImdb_id(),
                                        tvShow.getReleaseDate());
将其替换为以下内容:

    PreparedStatement statement = conn.prepareStatement("INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) " +
                                                "VALUES(?,?,?,?,?,?,?)";
statement.setString(1,"title");  
//rest of setters here  
statement.execute();  
conn.commit();

最有可能的问题是发布日期。数据库对于如何接受日期和时间非常挑剔。不能只是将一个看起来像日期的字符串插入SQL查询中

我建议使用适当的JDBC方法,即PreparedStatement.setTimestamp,它使JDBC驱动程序能够将表示日期的Java对象转换为数据库将接受的结构

,java.sql.Timestamp)

在您阅读了PrepatedStatement接口之后,我可以建议您研究SQL注入吗

由于一些评论提到了Bobby表,下面是关于Little Bobby的一些信息


您的代码很容易受到SQL注入攻击。 如果有人进入了一个叫‘’的电视节目;放下桌上的电视节目例如,你认为会发生什么

使用参数:

    PreparedStatement ps = this.connection.prepareStatement("INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) VALUES(?,?,?,?,?,?,?)");

    ps.setString(1, tvShow.getTitle());
    ps.setString(2, tvSHow.getPlot();
    //etc...

    ps.executeUpdate();

使用
PreparedStatement

String sqlQuery=“插入电视节目(标题、情节、海报、imdb\u评级、imdb\u url、imdb\u id、发布日期)值(?,,,,,,,?)”;
final PreparedStatement PreparedStatement=conn.prepareStatement(sqlQuery);
setString(1,tvShow.getTitle());
编制报表。设置字符串(2,绘图);
preparedStatement.setString(3,tvShow.getPoster());
preparedStatement.setString(4,tvShow.getImdb_Rating());
setString(5,tvShow.getImdb_url());
preparedStatement.setString(6,tvShow.getImdb_id());
preparedStatement.setString(7,tvShow.getReleaseDate());
切勿使用
字符串构建查询


使用易于受到攻击的
字符串构建的查询。他们也容易出现
字符串
转义的问题,就像您的示例中的

万岁!Jeeez,我从来没有想到在找到了大量PHP代码之后,找到一个易于Java SQL注入的代码会如此令人耳目一新。。。说真的,即使是像“鲍勃的故事”这样的有效字符串也会破坏这一点。。。(更不用说鲍勃的桌子了:)你好!使用一个
PreparedStatement
,你(和我们)的担忧就消失了。@jlordo我认为完全一样,当看到Bobby评论这个。。。我通常会说,谢天谢地,这对类似的问题不起作用。。。但是,嘿,这真的容易发生SQL注入吗<代码>'
被替换为
'
@Bobby Tables。。。是你吗?就个人而言,我建议使用集合语法以提高可读性。@Bobby,我不是在使用集合语法吗?或者这是我不知道的其他事情吗?我的意思是:
插入电视节目集title=?,plot=?,poster=?,…
@Bobby ah,直到关于SET syntaxOp还没有说明为什么这是个坏主意。您也没有解释为什么这对未来的读者来说是一个坏主意。@Woot4Moo进行了编辑,以明确问题是SQL注入和字符串转义。嘿,这是一个很好的问题,实际上没有看到任何相关的错误消息和诸如此类的东西。。。这很可能是OP面临的直接问题…@user1335163 OP,你需要检查Date是否真的是正确的类型。您可能需要使用数据库对其进行研究。有日期、时间和时间戳,它们是不同的,并且可能映射到基础RDBMS中的特定SQL类型。实际上并没有回答这个问题。我想严格地说,它没有回答,但我给出的代码也可以解决OP所述的问题以及SQL注入问题。
    PreparedStatement ps = this.connection.prepareStatement("INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) VALUES(?,?,?,?,?,?,?)");

    ps.setString(1, tvShow.getTitle());
    ps.setString(2, tvSHow.getPlot();
    //etc...

    ps.executeUpdate();