我循环遍历一系列结构,如下所示:
<cfloop array="#cfData#" index="i">
<cfif structKeyExists(i, "date")>
<cfset counter++>
<cfoutput>#counter#</cfoutput> Date is: <cfoutput> #i.date#</cfoutput> <br/>
</cfif>
</cfloop>
现在,我必须将Date和其他键的值插入到我的数据库中,我尝试如下:
<cfquery datasource="mydb" dbname="Stats">
INSERT INTO mydatabase
VALUES
<cfif structKeyExists(cfData, "date")>
<cfset counter++>#cfData.date#
</cfif>
,
<cfif structKeyExists(cfData, "delivered")>
<cfset counter1++>
#cfData.delivered#
</cfif>
,
... and so on for other key values...
</cfquery>
这是将它插入MySQL数据库的正确方法吗?
P.S:你也可以参考我以前的帖子获取更多信息:
Checking for key existence in structure
更新:
实际上,为了避免columlist不匹配,我决定将其测试为以下
<cfset KeyList = "delivered,
unique_open,
spamreport,
drop,
request,
bounce,
deferred,
processed,
date,
startdate,
enddate,
open,
blocked">
<cfloop from="1" to="#arraylen#" index="i">
<cfloop list="#KeyList#" index="colItem">
<cfif structKeyExists(cfData[i], "colItem")>
<cfoutput>#cfData[i].colItem#</cfoutput>
<cfelse>
NULL
</cfif>
<cfif colItem neq listLast(KeyList)>,</cfif>
</cfloop>
</cfloop>
仍然在浏览器中显示NULL。
然而,当我像下面这样测试它时,我得到了正确的结果:5 NULL 12 2 1 12 1
<cfloop from="1" to="#arraylen#" index="i">
<cfif structKeyExists(cfData[i], "delivered")>
<cfoutput>#cfData[i].delivered#</cfoutput>
<cfelse>
NULL
</cfif>
</cfloop>
使用KeyList元素有什么问题?
答案 0 :(得分:0)
这是插入数据的一种非常糟糕的方式。 sql insert语句如下所示:
insert into mytable
(field1, field2, etc)
values
(value1, value2, etc)
并且每个指定的字段都需要匹配的值。此外,每个值都需要匹配字段。
有另一种选择:
insert into mytable
values
(value1, value2, etc)
但是,如果你这样做,你需要为表中的每个字段赋值。
您在查询的值部分中有条件逻辑。如果您的任何cfif块返回false,则至少有一个问题,可能还有两个问题。你肯定会在字段数和值数之间产生不匹配。你可能会有一个额外的逗号。这两种情况都会导致查询崩溃。
我认为你需要一种不同的方法。 cfquery有一个null属性,可以在条件逻辑中使用。我会让你考虑一下。
答案 1 :(得分:0)
这个答案是基于插入数据的问题中链接的struts数组
如果你知道你的预期结构值和名称你的列名是相同的,这将是一个解决方案:
<!--- set your column names in a list --->
<cfset columnList = "date,delivered,open,processed,request,unique_open">
<cfquery datasource="mydb" dbname="Stats">
INSERT INTO mydatabase (#columnList#)
VALUES
<!--- loop through your array --->
<cfloop from="1" to="#arrayLen(cfData)#" index="i">
(
<!--- loop through the list of columns and see if they exists in the struct --->
<cfloop list="#columnList#" index="colItem">
<cfif structKeyExists(cfData[i], colItem)>
<cfqueryparam value="#cfData[i][colItem]#">
<cfelse>
NULL
</cfif>
<cfif colItem neq listLast(columnList)>,</cfif>
</cfloop>
)<cfif i neq arrayLen(cfData)>,</cfif>
</cfloop>
</cfquery>
同样采用这种格式,我建议在插入日期之前使用#createODBCDate()#