1

mysqlデータベースにデータを挿入しようとしていますが、エラーが発生し、コードでエラーを見つけることができません。私はmysqlが得意ではありません。

String insertQuery = "insert into books(title, author, description, prize)values("
            + title
            + ","
            + author
            + ","
            + desc
            + ", "
            + prize
            +  ");";

mysql> describe books;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| book_id     | int(11)      | NO   | PRI | NULL    |       |
| title       | varchar(64)  | YES  |     | NULL    |       |
| author      | varchar(64)  | YES  |     | NULL    |       |
| description | varchar(500) | YES  |     | NULL    |       |
| prize       | float        | YES  |     | NULL    |       |
| added       | datetime     | YES  |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

私が得るエラーは、

Query: insert into books(title, author, description, prize)values(sfdfdf,fdfdf,Please    limiasasaat your response to 500 characters., 78.9);
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limiasasaat your response to 500 characters., 78.9)' at line 1
4

4 に答える 4

4

文字列値は一重引用符で囲まれていません。これを試して:

String insertQuery = "insert into books(title, author, description, prize)values('"
            + title
            + "','"
            + author
            + "','"
            + desc
            + "', "
            + prize
            +  ");";

RoseIndiaでのプリペアドステートメントの例

更新1

PreparedStatementのサンプル:

//other codes here
String iSQL = "Insert into books(title, author, description, prize) values (?,?,?,?)";
// con is your active connection object
PreparedStatement pstmt = con.prepareStatement(iSQL);
pstmt.setString(1, title);
pstmt.setString(2, author);
pstmt.setString(3, desc);
pstmt.setFloat(4, prize);
pstmt.executeUpdate();
//other codes here

ただし、クラスのトップにあるこのステートメントを忘れないでください。import java.sql.*;

于 2012-05-20T10:06:55.223 に答える
3

varcharあなたの問題は、私が思うにあなたのパラメータの周りに引用符がないということです。

これらを必要とするパラメータの周りに引用符を含めるだけで、これを修正できます。

String insertQuery = "insert into books(title, author, description, prize)values('"
            + title
            + "','"
            + author
            + "','"
            + desc
            + "', "
            + prize
            +  ");";

ただし、これはまだ良い解決策ではありません。一重引用符を含む入力を処理できないためです(descパラメーターに文字列が含まれている場合、パラメーターが終了し、パーサーが終了するためDon't try this、クエリは失敗します。次に、期待しますが、)に遭遇し、SQLインジェクション攻撃にさらされます。'don'tdesc,t try this

あなたがすべきことは、プリペアドステートメントを使用することです。これにより安全になり、問題を回避することを心配する必要はありません。これはすべて自動的に処理されるためです。上記のように動作するようにハックすることができます。しかし、あなた自身の正気のために、そしてあなたの後にあなたのコードを扱わなければならないすべての人のために、準備されたステートメントを学び、それらを使用するために少し時間を費やしてください。将来、あなたは現在のあなたに感謝するでしょう。

oraclejavaWebサイトにプリペアドステートメントのチュートリアルがあります。

インデックスベースのプリペアドステートメントを使用することは、私には常に少し壊れやすいように思えます。パラメータを名前でバインドする方法の例があります。これにより、PreparedStatementsが少し読みやすくなるため、次のようになります。

String iSQL = "Insert into books(title, author, description, prize) values (:title,:author,:description,:prize)";

NamedParameterStatement pstmt =new NamedParameterStatement(connection,iSQL);
pstmt.setString("title", title);
pstmt.setString("author", author);
pstmt.setString("description", desc);
pstmt.setFloat("prize", prize);
pstmt.executeUpdate();
于 2012-05-20T10:03:34.113 に答える
1

プリペアドステートメントを使用することをお勧めしますが、それでも現在の方法を使用したい場合は、これが文字エントリであり、整数エントリであることをMYSQLに通知する必要があります。

文字エントリと整数エントリの違いを定義するには、文字エントリを一重引用符で囲む必要があります。

于 2012-05-20T10:11:28.637 に答える
1

prepareStatementを使用します。値が変化する場所でステートメントを使用すると、間違いなくそのような結論につながります。非常に良い例がjohntotetwooによって与えられています。それを見てください。

于 2012-05-20T12:01:13.763 に答える