2012-03-31 75 views
2

目前我正在編寫一個JDBC應用程序來管理MySQL數據庫。我有刪除,插入和選擇方法與正確的查詢功能。我遇到Update方法的問題。如果使用下面的代碼使用我收到一個MySQL錯誤:我的SQL查詢是否導致我的JDBC錯誤?

您的SQL語法錯誤;檢查對應於你的MySQL服務器版本正確的語法使用鄰近「手冊」街「鎮」,市「郵編」,年齡「郵件」,RunningFee'false'Where PID =」 1行。 ..

private void updateData() 
{ 
    Connection con; 
    try 
    { 
     Class.forName("com.mysql.jdbc.Driver"); 
     con = DriverManager.getConnection(
       "jdbc:mysql://localhost/snr","root",""); 

     String sql = "Update participant Set password='"+txtpassword.getText()+"'," + 
       "lastName='"+txtlastName.getText()+"',firstName='"+ 
       txtfirstName.getText()+"',HouseNumber'"+txtHouseNumber.getText()+"',Street'"+txtStreet.getText()+"',Town'"+txtTown.getText()+"',City'"+txtCity.getText()+"',PostCode'"+txtPostCode.getText()+"',Age'"+txtAge.getText()+"',email'"+txtemail.getText()+"',RunningFee'"+cbRunningFee.isSelected()+"' Where PID='"+txtPID.getText()+"'"; 

     Statement statement = con.createStatement(); 

     statement.execute(sql); 

     createMessageBox("Updated Successfully"); 

     clearControls(); 
    } 
    catch(Exception e) 
    { 
     createMessageBox(e.getMessage()); 
    } 
} 

是不是有什麼毛病我的SQL查詢?

+0

墊具有它的權利,不過,是不是很明顯這是與查詢的問題嗎?這正是錯誤信息所說的,它甚至會告訴你哪裏錯誤是(或多或少)。而且,SQL注入。 – 2012-03-31 14:42:56

回答

4

是的,你的查詢是錯誤的。你上一個大大的一堆set列/值對失蹤=

(並且請考慮使用準備好的語句並綁定變量,SQL注入不是您想要打開的東西。)

+0

哇,我不敢相信我沒注意到。謝謝。它應該是'',HouseNumber ='「+ txtHouseNumber.getText()+」對嗎? – user1080390 2012-03-31 14:43:25

+2

@ user1080390和街道,城鎮,郵編,年齡和...... SQL注入。 – 2012-03-31 14:56:49

+0

@ user1080390防止SQL注入你應該使用'PreparedStatement'就像@dasblinkenlight建議的那樣 – 2012-03-31 15:12:06

1

你忘記一些=在您的查詢。

嘗試

String sql = "Update participant Set password='"+txtpassword.getText()+"'," + 
      "lastName='"+txtlastName.getText()+"',firstName='"+ 
txtfirstName.getText()+"',HouseNumber='"+txtHouseNumber.getText()+"',Street='"+ 
txtStreet.getText()+"',Town='"+txtTown.getText()+"',City='"+txtCity.getText()+ 
"',PostCode='"+txtPostCode.getText()+"',Age='"+txtAge.getText()+"',email='"+ 
txtemail.getText()+"',RunningFee='"+cbRunningFee.isSelected()+ 
"' Where PID='"+txtPID.getText()+"'"; 
1

錯誤「你在你的SQL語法錯誤」是從SQL Server和指示是,你必須在你的查詢時出現錯誤。在這些情況下,我經常發現打印構造的查詢本身很有用,只是爲了檢查它是否正確構建。

在你的情況下,我相信問題是你錯過了一堆「=」,你可能也需要在java中逃避你的單引號,這樣它們才能正確傳遞(用'替換')。

2

不僅是您的查詢不正確,但它也可能會打開你SQL Interjection Attacks

你需要用問號代替粘貼,價值觀,準備語句,並執行它parameterize查詢。查看我鏈接的教程。

最後,存儲密碼以純文本是一個非常,非常糟糕的主意。

String sql = "UPDATE participant SET "+ 
    "password=?, lastName=?, firstName=?, HouseNumber=?, Street=?, Town=?, "+ 
    "City=?,PostCode?,Age=?,email=?,RunningFee=? "+ 
    "WHERE PID=?"; 
PreparedStatement upd = con.prepareStatement(sql); 
upd.setString(1, txtpassword.getText()); 
upd.setString(2, txtlastName.getText()); 
// ... and so on 
upd.executeUpdate(); 
con.commit(); 
2

是的,查詢有問題。您構建查詢的方式容易受到SQL注入的影響。使用參數化查詢,而不是像這樣連接文本。

閱讀這篇文章:Preventing SQL Injection in Java