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

Coldfusion/Lucee - Loop over 3D array to insert into database using multiple inserts using one query

我知道标题是 mouth-full - 很抱歉,但我想在这里具体说明。

数据库:MySql(技术上是玛丽亚)
ColdFusion(技术上是 Lucee:5.x)

数组如下所示:

注意:最外面的数组只显示了 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); 

我收到的错误消息是

Element at position [1] doesn't exist in array

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

我建议不要循环 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 字符串后,执行查询以插入记录。 (您可能会以不同的方式构建上述函数来处理构建查询字符串和参数,然后在一个地方执行它们。)

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

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