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是值之一 - 它是调用的结果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, ...);

fooURL当您查看没有引号的 SQL 时,您应该能够更容易地看到。因此它被解释为一个表达式,而不是一个简单的标量字符串值。单个单词的表达式仅假定为列名,但在 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 回答