Coldfusion / Lucee - 使用一个查询循环遍历3D数组以使用多个插入插入到数据库中

时间:2017-12-24 22:55:26

标签: coldfusion lucee

我知道标题是满口的 - 抱歉,但试图在这里具体说明。

DB:MySql(技术上是Maria)
ColdFusion(技术上是Lucee:5.x)

数组如下所示:
enter image description here

注意:大多数阵列只显示2的一部分,可以继续进入30年代。

我希望在数组上执行循环以插入标记为" string"的元素。在图像中使用一个查询进入数据库。为了清晰和简洁起见,已对查询进行了修整:

for (outer = 1; outer <= ArrayLen(myArray); outer++) {
    local.currentrow = local.currentrow + 1;
    for (inner = 1; inner <= ArrayLen(myArray[outer]); inner++) {
            local.sql = "
                INSERT INTO table (uuid, typeID, menuId, activityID, userID)
                VALUES (
                    '#local.uuid#',
                    #myArray[outer][inner][1]#, 
                    #myArray[outer][inner][2]#,
                    #myArray[outer][inner][3]#,
                    #arguments.formDataStruct.userID#
            )";  
    queryExecute(local.sql);   
    }
}

我正在寻找这条线上的东西,但正如所写,它不起作用:

local.sql = "
INSERT INTO table (uuid, typeID, menuId, activityID, userID)
VALUES (
    if (local.currentrow gt 1) {
        ,
    }
    for (outer = 1; outer <= ArrayLen(myArray); outer++) {
        local.currentrow = local.currentrow + 1;
        for (inner = 1; inner <= ArrayLen(myArray[outer]); inner++) {

                    '#local.uuid#',
                    '#myArray[outer][inner][1]#', 
                    '#myArray[outer][inner][2]#',
                    '#myArray[outer][inner][3]#',
                    '#arguments.formDataStruct.userID#'
        }
    })
";
queryExecute(local.sql); 

我收到的错误消息是

  

位置[1]的元素不存在于数组

但如果我执行writedump[1][3][3](例如),我会得到值24。

1 个答案:

答案 0 :(得分:3)

我建议不要在INSERT语句上循环,而只是循环VALUES以生成单个INSERT语句。单个INSERT将更快地执行 ,并且它将最小化与数据库的连接。

使用以下内容构建值列表:

  for (var outer in arguments.inArray) {
    for (var inner in outer) {
      // Concat elements of inner array to a SQL VALUE string. If UUID is supposed to be a unique identity for the row, use Maria's uuid() instead of CF (or skip the UUID insert and let Maria do it).
      // inArray elements and inUserID should be sanitized.
      local.values &= "( uuid(), '" & inner[1] & "','" & inner[2] & "','" & inner[3] & "'," & local.userID & ")," ;
    }
  }
  local.values = left(local.values,len(local.values)-1) ; // Get rid of the last comma.
  local.sql = "INSERT INTO table (uuid, typeID, menuId, activityID, userID) VALUES " & local.values ;

在您构建SQL INSERT字符串后,执行查询以INSERT记录。 (你可能会以不同的方式构建上面的函数来处理构建查询字符串和参数,然后在一个地方执行它。)

不要忘记清理阵列和其他输入。阵列是来自您控制的源还是用户输入?

https://trycf.com/gist/7ad6af1e84906b601834b0cc5ff5a392/lucee5?theme=monokai http://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=d11f45f30723ba910c58a1e3f7a7c30b