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
我知道标题是 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