2013-12-07 101 views
0

正在嘗試向數據庫中插入值,但如果有人能夠發現它,似乎存在代碼問題。我使用一個Servlet,以獲取用戶輸入,然後使用一種方法發送的輸入到下面的類:我的插入語句不起作用

@Override 
public String createItem(String title, String info, String url, String imageFilename) { 

    String addItem = title; 
    Connection conn = null; 

    try 
    { 
     Class.forName("org.sqlite.JDBC"); 
     conn = DriverManager.getConnection("jdbc:sqlite:" + DBPath); 


     if (conn == null) 
     { 
      System.err.println("Database connection was null:("); 
      return addItem; 
     } 

     Statement stmt = conn.createStatement(); 
     String query = "INSERT INTO items (title, info, URL, image) VALUES (newtitle, newInfo, newUrl, newImage)"; 

     //String query = "INSERT INTO items (title, info, URL, image) VALUES(" + title + "," + info + "," + url +","+ imageFilename +")"; 

     stmt.executeUpdate(query); 

     stmt.close(); 
    } 

    catch(Exception e) 
    { 
     System.err.println("Exception querying database" + e.toString()); 
    } 

    finally 
    { 
     try 
     { 
      conn.close(); 
     } 
     catch(Exception e) 
     { 
     System.err.println("Exception querying database" + e.toString()); 
     } 
    } 
    return addItem; 

}

我試圖鍵入這些值,而無需使用在該方法中傳遞的值來自servlet。 我檢查了我的插入語句在Sqlite管理器和它的工作,我也檢查,如果值發送到上面的類,它工作,我已經嘗試了連接,所以它使我從它檢索數據,但不插入到它。所以我不知道爲什麼它不存儲數據庫中的值。

+0

什麼確切的症狀導致你得出結論「看起來代碼存在問題」? –

+0

1-我已經在其他方法中嘗試了「到數據庫」的連接,並且它沒有問題,因爲我使用了SELECT語句,並且可以從中檢索數據。 2-I檢查我在方法中傳遞的變量是否正常工作,因爲您可以看到我將值返回給servlet,並顯示「String addItem = title;」。 – user114161

+0

但你仍然沒有描述任何症狀。 「不起作用」不是一個症狀,這是一種抱怨。 –

回答

0

INSERT肯定是行不通的:

String query = "INSERT INTO items (title, info, URL, image) VALUES (newtitle, newInfo, newUrl, newImage)"; 

即使你想存儲這些作爲字符串文字,你必須在SQL語句中像這樣使用單引號:

String query = "INSERT INTO items (title, info, URL, image) VALUES ('newtitle', 'newInfo', 'newUrl', 'newImage')"; 

存儲實際值,而不是變量名(我猜是你想要的),使用PreparedStatement這樣的:

PreparedStatement stmt = conn.prepareStatement(
    "INSERT INTO items (title, info, URL, image) VALUES (?, ?, ?, ?)" 
); 
stmt.setString(1, newtitle); 
stmt.setString(2, newInfo); 
stmt.setString(3, newUrl); 
stmt.setString(4, newtitle); 
stmt.executeUpdate(); 

這樣做可以防止SQL注入攻擊。

+0

我認爲它會工作。如果該值不是單個標記,則只需使用引號。 –

+0

我改變了嗎?到變量名? 或者只有我們在setString中有變量名稱 – user114161

+0

不要更改問號,將它們保持原樣。 'setString()'會處理剩下的事情。 –