-1

だから私はデータベースに何かを追加したいのですが、うまくいきませんthis.statement.executeUpdate(sqlQuery);。を印刷してsqlQueryphpMyAdmin で呼び出すと、機能します。

これに似たいくつかの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')

コード:

public boolean insert_tvShow(TvShow tvShow) {

    boolean success = false;
    String plot = tvShow.getPlot();
    plot = plot.replaceAll("'", "''");

    try {
        this.statement = this.connection.createStatement();
        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());
        System.out.println(sqlQuery);
        this.statement.executeUpdate(sqlQuery);
        success = true;
    } catch(Exception e) {

    } finally {
        try {
            connection.close();
        } catch (SQLException e) {}
    }

    return success;
}

編集:

OK、これからは PreparedStatement を使用します。しかし、まだコードを実行できません。エラーが発生しないため、知る方法がありません。おそらく 1 つの原因は私の release_date であるため、最初はそれなしで機能するようにします。"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;
}
4

4 に答える 4

3

あなたのコードは、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();
于 2013-03-25T12:44:44.350 に答える
2

これを決してしないでください:

 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();
于 2013-03-25T12:43:45.717 に答える
1

おそらく、問題はリリース日です。データベースは、日付と時刻を受け入れる方法にうるさいです。日付のように見える文字列を単に SQL クエリに押し込むことはできません。

PreparedStatement.setTimestamp という適切な JDBC メソッドを使用することをお勧めします。これにより、JDBC ドライバーは、日付を表す Java オブジェクトをデータベースが受け入れる構造に変換できるようになります。

http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#setTimestamp(int , java.sql.Timestamp)

PrepatedStatement インターフェースについて読んだら、SQL インジェクションについて調べることをお勧めしますか?

http://en.wikipedia.org/wiki/SQL_injection

いくつかのコメントが Bobby Tables に言及していたので、Little Bobby についての情報を以下に示します。

http://bobby-tables.com/

于 2013-03-25T12:44:11.090 に答える
1

次を使用しPreparedStatementます。

    String sqlQuery = "INSERT INTO tvshows (title, plot, poster, imdb_rating, imdb_url, imdb_id, release_date) VALUES(?, ?, ?, ?, ?, ?, ?)";
    final PreparedStatement preparedStatement = conn.prepareStatement(sqlQuery);
    preparedStatement.setString(1, tvShow.getTitle());
    preparedStatement.setString(2, plot);
    preparedStatement.setString(3, tvShow.getPoster());
    preparedStatement.setString(4, tvShow.getImdb_Rating());
    preparedStatement.setString(5, tvShow.getImdb_url());
    preparedStatement.setString(6, tvShow.getImdb_id());
    preparedStatement.setString(7, tvShow.getReleaseDate());

を使用してクエリを作成しないでくださいString

SQL インジェクション攻撃を受けStringやすいものを使用して構築されたクエリ。また、例のように、エスケープの問題が発生する傾向があります。String'

于 2013-03-25T12:46:09.697 に答える