将结构元素插入数据库

时间:2014-01-29 22:05:30

标签: mysql coldfusion

我循环遍历一系列结构,如下所示:

<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元素有什么问题?

2 个答案:

答案 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()#