【问题标题】:Getting rid of comma摆脱逗号
【发布时间】:2013-12-13 18:59:00
【问题描述】:

我是 java 新手,需要帮助摆脱 sql 查询中的逗号。谁能指导我正确的方向?

    query = "UPDATE " + tablename + " SET ";
    for(int i=0; i< columnnames.size(); i++)
    {
    query+= "'" + columnnames.get(i)  + "' = '" + row[i] + "',";
     }
     query = StripLastComma(query); //Not sure how to do this in Java.
    query +="' WHERE " + FirstColumn + " = '" + rowstandard + "'";

【问题讨论】:

  • 你只是想省略最后一个逗号吗?
  • 到此为止。 您的查询易受 SQL 注入攻击。请改用PreparedStatement
  • 我建议不要把逗号放在首位。
  • 是的,我只想去掉最后一个逗号
  • 您可以只使用类似于 if(i==columnnames.size()-1){AS CURRENT}else{DON'T PUT COMMA in} 的 if 语句

标签: java sql regex sqlite comma


【解决方案1】:

你可以这样做:

query = query.substring(0, query.length()-1);

在“//不确定如何在 Java 中执行此操作。”的位置。

还有:

1) 正如 Makoto 所写,使用 PreparedStatement。也读了一下
关于 SQL 注入以及如何保护自己免受它的侵害。

2) 使用 StringBuilder 而不是 String 会更适合您的情况。
那是因为,您似乎使用 String 并且它是不可变的。
因此,当删除最后一个逗号时,您实际上是在创建一个
全新的 String 对象,实际上不需要像其他指出的
在他们的 cmets 中。

【讨论】:

  • -1:因为“更好”出现在有关易受 SQL 注入攻击的查询的语句中。虽然从句法上讲你是对的,但这是一种可怕的做法。
  • @Makoto 我们在这里不是在讨论 SQL 注入,而是在讨论使用 String 与 StringBuilder。如果他想防御 SQL 注入,他仍然可以使用 PreparedStatement。
  • 我让它工作了,但实际上我必须将它设置为 -2 才能工作。
  • 嗯,也许你最后还有一些其他的字符。好的。
【解决方案2】:

忽略已经提到的 SQL 注入问题,我会使用 StringBuilder 并这样做以避免最后一个逗号。

StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("UPDATE " + tablename + " SET ");
for(int i = 0; i < columnnames.size(); i++) {
  if (i != 0) {
    queryBuilder.append(",");
   }

  queryBuilder.append("'" + columnnames.get(i)  + "' = '" + row[i] + "'");
}

queryBuilder.append("' WHERE " + FirstColumn + " = '" + rowstandard + "'");
query = queryBuilder.toString();

【讨论】:

    【解决方案3】:

    首先,你有一个错误:你不应该引用你的列名。

    通过使 first 迭代的逻辑不同并将逗号放在 内容之前,最容易处理逗号问题,这巧妙地处理了只有一栏:

    if (i > 0)
        query += ",";
    query += columnnames.get(i) + " = '" + row[i] + "'";
    

    您的代码容易受到 SQL 注入的攻击,但如果唯一的客户端是您自己的代码(即您知道列的新值是“安全的”),那就没关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2020-06-22
      • 1970-01-01
      • 2011-10-02
      相关资源
      最近更新 更多