2013-03-11 92 views
1

我試圖執行以下語句:SQL語法錯誤異常

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()

我是新來處理數據庫,我敢肯定,一個簡單的語法錯誤導致了這一點。

回答

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(); 
+0

再次感謝@Perception – drewmoore 2013-03-11 21:42:46

2

您正在查看數據的附加信息。你寫它的方式,你指的是列名。

改寫這樣的:

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

很顯然,你將有你把它放到數據庫之前逃跑的數據。

0

用雙引號括住任何字符串值。你也需要逃避它們。

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

強制性不要忘記淨化你的輸入單引號的話。

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(); 

您不需要引用或轉義查詢參數。使用參數要比記住平衡的引號標記要容易得多。出於這個原因,它也更安全,因爲你更有可能做到這一點。