Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java mySQL嵌套循环不会执行_Java_Mysql_Sql_Web Services_Nested Loops - Fatal编程技术网

Java mySQL嵌套循环不会执行

Java mySQL嵌套循环不会执行,java,mysql,sql,web-services,nested-loops,Java,Mysql,Sql,Web Services,Nested Loops,我正在开发一个基于SOAP的Web服务,其中一部分我必须使用嵌套循环对数据库执行一些查询,问题是内部循环在放弃之前只执行一次。以下代码: 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

我正在开发一个基于SOAP的Web服务,其中一部分我必须使用嵌套循环对数据库执行一些查询,问题是内部循环在放弃之前只执行一次。以下代码:

          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] + "')";
        }

      }

for(int i=0;i您的用例是应该使用准备好的语句的完美例子。请在中阅读有关它们的更多信息

使用预先准备好的语句将允许

  • 避免SQL注入攻击。绝不应使用字符串连接来生成SQL查询。恶意用户可能会输入某些特殊值,从而完全改变查询的含义。非恶意用户可能会输入特殊字符(例如引号)这会导致查询失败,因为它的语法不正确
  • 让数据库只为正在执行的所有insert查询准备一次执行计划。实际上,查询总是相同的。只有参数会更改
因此,代码应该如下所示:

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();
    }
}

尝试使用PreparedStatement及其批处理功能,而不是简单的查询,以简化代码并防止SQL注入。

尝试为每个查询创建不同的
语句
对象。此外,修复SQL注入漏洞。您能详细说明一下吗?您的意思是我应该在循环中创建语句吗?我如何保护myself反对SQL注入?是的,为每个查询创建语句对象,执行查询,然后销毁对象。有关使用准备好的语句保护自己免受SQL注入攻击的详细信息,请参阅和相应的答案。非常感谢,我会在实现您的建议后回来。@cdhowie:准备好的语句的想法ement是使用不同的参数多次重用它。这是它比常规语句更有效的地方。不应该为每个查询销毁和重新创建它。不过,即使是一次性查询,也最好使用它们来避免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();
    }
}