MySQL вложенный цикл не будет выполняться - PullRequest
0 голосов
/ 24 августа 2011

Я работаю над основанным на SOAP веб-сервисом, где в части его я должен выполнить некоторые запросы к базе данных, используя вложенный цикл, проблема в том, что внутренний цикл просто выполняется только ОДИН раз, прежде чем сдаться. Это код:

          for(int i=0; i<selec.length; i++){
                for(int j=0; j<sintom.length;j++){
                    var[(i*sintom.length)+j] = "INSERT INTO malattia (nome, eta,  descrizione, sesso, etnia, sintomi) "
                + "VALUES ('" + malattia + "','" + eta + "','" + descrizione + "','" +  sexarra[0] + "','" + selec[i] + "','" + sintom[j] + "')";
        }

      }

Здесь должны выполняться запросы:

        if (errore.equals("")) {
              try {
                    Statement st = conn.createStatement();
      for(int i=0; i<selec.length; i++){
        for(int j=0;j<sintom.length;j++){

                     st.executeUpdate(var[(i*sintom.length)+j]);}}

Что происходит, так это то, что независимо от размера выберите , он будет работать нормально, если длина sintom равна 1, больше 1 и не будет работать.

Спасибо за советы экспертов, всегда благодарны!

Ответы [ 2 ]

1 голос
/ 24 августа 2011

Попробуйте использовать PreparedStatement и его пакетную функцию вместо простого запроса, чтобы упростить код и предотвратить SQL-инъекцию.

1 голос
/ 24 августа 2011

Ваш вариант использования является прекрасным примером случая, когда следует использовать подготовленное утверждение.Подробнее о них читайте в руководстве по JDBC .

. Использование подготовленного оператора позволит

  • избежать атак с использованием SQL-инъекций.Никогда не следует использовать конкатенацию строк для построения SQL-запроса.Злонамеренный пользователь может ввести какое-то специальное значение, которое полностью изменит смысл вашего запроса.Пользователь, не являющийся злоумышленником, может вводить специальные символы (например, в кавычках), которые могут привести к сбою запроса, поскольку он не синтаксически корректен.
  • разрешить базе данных подготовить план выполнения только один раз для всех запросов вставки, которые вы 'выполняетсяДействительно, запрос всегда один и тот же.Изменяются только параметры.

Итак, код должен выглядеть так:

PreparedStatement ps = conn.prepareStatement("INSERT INTO malattia (nome, eta, ...) values (?, ?, ...)");
for (int i= 0; ...) {
    for (int j = 0; ...) {
        ps.setString(1, malattia);
        ps.setString(2, eta);
        ...
        ps.executeUpdate();
    }
}
...