2015-02-23 97 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