![](/img/trans.png)
[英]How can I create a new table in my SQLite Database using a param from a Java String variable?
[英]How do I retrieve a row from a SQLite database through Java's jdbc using a string variable?
這應該返回名稱等於字符串變量名稱的行,但是我得到的只是這個錯誤
[SQLITE_ERROR] SQL錯誤或缺少數據庫(“戰爭”附近:語法錯誤)
在這種情況下,由於我使用的是電影數據庫,因此嘗試使用“星球大戰”作為名稱變量。 我究竟做錯了什么?
public void selectName(ObservableList<Movies> movieList, String name){
String sql = "SELECT id, name, year FROM movies WHERE name = " + name + " ";
try(Connection conn = this.Connect();
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery(sql)){
while(rs.next()){
movieList.addAll(new Movies(rs.getInt("id"),rs.getString("name"),rs.getInt("year")));
}
}catch(SQLException ex){
System.out.println(ex.getMessage());
}
收到錯誤的原因是您正在執行[..] where name = Star Wars
,這是無效的。 如果您使用文字查詢字符串(該值是固定值而不是用戶輸入的值),則正確的查詢將是[..] where name = 'Star Wars'
。
一種簡單的解決方案似乎是將值括在單引號中,但是您永遠不應將值連接到查詢字符串中(尤其是如果它們是用戶輸入,則不要這樣),因為這會使您容易受到SQL注入的攻擊。
相反,您應該使用參數化查詢(又稱預處理語句)並設置參數值。 這樣,驅動程序將以避免潛在的SQL注入風險的方式正確處理參數。
具體來說,您應該執行以下操作:
try (PreparedStatemet select = connection.prepareStatement(
"SELECT id, name, year FROM movies WHERE name = ?")) {
select.setString(1, name);
try (ResultSet rs = select.executeQuery() {
// process result set
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.