1

次のステートメントを実行しようとしています。

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (" + a.getImgURL() + " , " + a.getLinkURL() + " , " + a.getClient() + " , " + a.getIdx() + ");";

しかし、私はエラーが発生しています:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'fooUrl' in 'field list'

しかしfooUrlは値の 1 つです。これは を呼び出した結果ですa.getImgUrl()

データベースの操作は初めてで、単純な構文エラーが原因であると確信しています。

4

4 に答える 4

4

準備済みステートメントを使用すると、この種の問題を回避でき、より安全なコードを記述できます。

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (?, ?, ?, ?)";
final PreparedStatement statement = conn.prepareStatement(sql);
statement.setString(1, a.getImgURL()) ;
statement.setString(2, a.getLinkURL()) ;
statement.setString(3, a.getClient()) ;
statement.setString(4, a.getIdx());
final ResultSet results = statement.executeQuery();
于 2013-03-11T21:40:37.247 に答える
2

データを囲む引用符がありません。あなたが書いた方法では、列名を参照しています。

次のように書き換えます。

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) 
        VALUES ('" + a.getImgURL() + "' , '" + a.getLinkURL() + "' , '" +
                a.getClient() + "' , '" + a.getIdx() + "');";

明らかに、データをデータベースに入れる前にエスケープする必要があります。

于 2013-03-11T21:37:41.323 に答える
0

文字列値は二重引用符で囲みます。あなたもそれらをエスケープする必要があります。

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (\"" + a.getImgURL() + "\" , "\" + a.getLinkURL() + \"" , \"" + a.getClient() + "\" , " + a.getIdx() + ");";  

一重引用符のコメントの入力をサニタイズすることを忘れないでください。

于 2013-03-11T21:41:24.337 に答える
0

SQL を構築するコードを見て SQL をデバッグしようとするのは困難です。

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES ("
  + a.getImgURL() + " , " + a.getLinkURL() + " , " + a.getClient() + " , " 
  + a.getIdx() + ");";

sql代わりに、結果の文字列を調べます。

INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (fooURL, ...);

引用符で囲まれていないSQL を見ると、より簡単に確認できるはずですfooURL。したがって、単純なスカラー文字列値ではなく、式として解釈されます。単一の単語の式は列名であると見なされますが、その名前の列は ad テーブルに存在しません。

文字列を SQL ステートメントに補間することは避けたほうがはるかによいでしょう。 代わりに、準備されたクエリとクエリ パラメーターを使用する方法を学習してください。

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) "
  + " VALUES (?, ?, ?, ?)";
PreparedStatement insertAd = con.prepareStatement(sql);
insertAd.setString(1, a.getImgUrl);
insertAd.setString(2, a.getLinkUrl);
insertAd.setInt(3, a.getClient);
insertAd.setInt(4, a.getIdx);
insertAd.executeUpdate();

クエリ パラメータを引用またはエスケープする必要はありません。バランスの取れた引用符がどこにあるかを覚えておくよりも、パラメーターを使用する方がはるかに簡単です。そのため、正しく行う可能性が高くなるため、安全性も高くなります。

于 2013-03-11T21:43:27.400 に答える