2015-02-23 62 views
1

我從HTML表單中獲取數組中的動態數據值。帶有動態列名稱的UPDATE TABLE

現在我想用這些數據更新我的表格。 列名是column1,column2 ...等等; 我有array[]中的數據和更新的列數unumber 我正在使用此代碼,但它不工作。 P:我是新來的編碼,所以它可能是天真的。

for(int i=1; i<=unumber; i++) 
{ 
     String username = "someuser"; 
     String column = "column" + Integer.toString(i); 
     PreparedStatement pr = null; 
     String query1 = "update table1 set (?) = (?) where username = (?)"; 
     pr = con.prepareStatement(query1); 
     pr.setString(1, column); 
     pr.setString(2, array[i]); 
     pr.setString(3, someuser); 
     int s = pr.executeUpdate(); 
} 
+1

作爲一個快速提醒,你沒有在桌子上做ALTER,因爲這個關鍵字的含義非常不同。您正在更新行中的字段,完全不同的問題 – 2015-02-23 07:19:05

+0

抱歉..更正 – Sushovan 2015-02-23 07:20:50

+3

您無法在預準備語句中使用標識符的參數。 – 2015-02-23 07:27:15

回答

3

PreparedStatment s只能綁定值,而不是語法元素或對象的名稱,如列,所以這種做法是行不通的。你將不得不回落到字符串操作:

for(int i=0; i<unumber; i++) { 
     String username = "someuser"; 
     String column = "column" + Integer.toString(i);; 
     PreparedStatement pr = null; 
     String query1 = "update table1 set " + column + " = (?) where username = (?)"; 
     pr = con.prepareStatement(query1); 
     pr.setString(1, column); 
     pr.setString(2, someuser); 
     int s = pr.executeUpdate(); 
} 

此外,因爲您要更新多個列使用相同的where子句中,你可以遍歷列和構建公正一個更新語句。它會強制你有兩個循環(一個用於構建查詢,一個用於綁定值,一旦查詢準備就緒),但它應該仍然快得多,因爲你只訪問一次數據庫而不是N次:

String username = "someuser"; 
StringBuilder sql = new StringBuilder("update table1 set "); 
for(int i=0; i < unumber; i++) { 
    sql.append("column") 
     .append(i). 
     .append(" = ?"); 
    if (i != (unumber - 1)) { 
     sql.append(", "); 
    } 
} 
sql.append("where username = (?)"); 

PreparedStatement pr = con.prepareStatement(sql.toString()); 

for(int i = 0; i < unumber; i++) { 
    pr.setString(i, array[i]); 
} 
pr.setString(unumber, someuser); 
int s = pr.executeUpdate(); 
4

AFAIK,你不能使用「準備好的語句」。您可以通過在查詢自己執行插入解決這個問題:

String query1 = "update table1 set "+column+" = ? where username = ?"; 
    pr = con.prepareStatement(query1); 
    pr.setString(1, array[i]); 
    pr.setString(2, someuser); 

要知道SQL注入的。您最好檢查列的可能值是否不能更改。 驗證導致確定列名稱的所有輸入

確保用戶不能指定他/她自己的列:否則例如可以將列設置爲password併爲某個用戶設置密碼。然後使用該密碼登錄。或者人們可以嘗試設置column'; drop table foo; select * where x

+0

@JBNizet:確實,這是我犯的一個錯誤。感謝您的注意。 – 2015-02-23 07:25:49

+0

非常感謝..它的工作.. – Sushovan 2015-02-23 07:38:04