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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Coldfusion / Lucee - 使用一个查询循环遍历3D数组以使用多个插入插入到数据库中相关的知识,希望对你有一定的参考价值。

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

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。

答案

我建议不要在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

以上是关于Coldfusion / Lucee - 使用一个查询循环遍历3D数组以使用多个插入插入到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

将 ColdFusion 连接到 Google Bigquery

如何注册 ColdFusion 回调并从 Java 类调用它?

cfscript中IF块内的coldfusion continue关键字/奇怪的行为

查询多个订单的CF查询按语句添加最后排序的列进行选择

如何使用 Lucee 将 UTF-8 数据插入 MySQL?

lucee 5.x ListEach似乎无法访问本地var范围?