我正在尝试执行以下语句:
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
是其中一个值 - 它是调用a.getImgUrl()
的结果。
我刚接触数据库,我确信一个简单的语法错误导致了这个问题。
答案 0 :(得分:3)
您将避免这些问题,如果您使用准备好的声明,您将编写更安全的代码。
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();
答案 1 :(得分:2)
您的数据缺少引号。你写它的方式,你指的是列名。
像这样改写:
String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`)
VALUES ('" + a.getImgURL() + "' , '" + a.getLinkURL() + "' , '" +
a.getClient() + "' , '" + a.getIdx() + "');";
显然,在将数据放入数据库之前,您必须先将数据转义。
答案 2 :(得分:0)
用双引号括起任何字符串值。你也需要逃避它们。
String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (\"" + a.getImgURL() + "\" , "\" + a.getLinkURL() + \"" , \"" + a.getClient() + "\" , " + a.getIdx() + ");";
强制性请勿忘记清理单引号备注的输入。
答案 3 :(得分: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, ...);
当您查看fooURL
没有引号的SQL时,您应该能够更轻松地查看。因此,它被解释为表达式,而不是简单的标量字符串值。单个单词的表达式只是假定为列名,但广告表中该名称不存在此类列。
避免将字符串插入SQL语句会好得多。 Learn how to use prepared queries and query parameters instead.
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();
您不需要引用或转义查询参数。使用参数比记住平衡引号的位置要容易得多。因此,它也更安全,因为你更有可能做得对。