2009-08-12 69 views
0

CF8和MySQL5,用于在INSERT INTO中循环。sql语法错误,同时在cfquery中插入cfloery INSERT INTO

我正在获取表单数据并试图优化insert语句以在cfquery中循环。 最好的情况是,循环只是在VALUES附近,以便拥有一个INSERT,但我在尝试识别第二个迭代时遇到了问题,并且在第一个INSERT VALUES的开头放了一个逗号。 所以我用循环遍历整个INSERT。至少在同一个cfquery中。我的问题是我无法得到正确的循环的第二个(和更多)迭代的语法。它对第一个工作正常,如果我把环路取出,工作正常。

我得到的错误是:

sql syntax error near 'INSERT INTO table(wID,session,xNameVar,xID,set1rt,set2rt,set3rt,set4rt,set5rt,set' 

这里是我使用的代码代码:

<cfif structKeyExists(form, "x1s1xID")><!--- verifies if there is data in field 1 for a specific form section---> 
    <cfquery name="qCreateXdata" datasource="#application.datasource#"> 
    <cfloop from="1" to="#form.sessions#" index="i"><!--- form.sessions is a variable for the number of times to loop ---> 
     <cfif structKeyExists(form, "x1s#i#xID")><!--- a little redundant but used for other iterations of loop otherwise get a variable not defined error ---> 
     INSERT INTO table 
     (wID, 
     session, 
     xNameVar, 
     xID, 
     set1rt, 
     set2rt, 
     set3rt, 
     set4rt, 
     set5rt, 
     set6rt) 
     VALUES 
     (#variables.wID#, 
     #wCreateFormData["session" & i]#, 
     '#wCreateFormData["x1s" & i & "xNameVar"]#', 
     #wCreateFormData["x1s" & i & "xid"]#, 
     <!--- the below values are not required in form so need to be null integers instead of empty strings if not set in form ---> 
     <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x1set1reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x1set1r" & i]))#" />, 
     <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x1set2reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x1set2r" & i]))#" />, 
     <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x1set3reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x1set3r" & i]))#" />, 
     <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x1set4reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x1set4r" & i]))#" />, 
     <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x1set5reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x1set5r" & i]))#" />, 
     <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x1set6reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x1set6r" & i]))#" /> 
     ) 
     <cfif structKeyExists(form, "x2s#i#xID")> 
      ,(#variables.wID#, 
      #wCreateFormData["session" & i]#, 
      '#wCreateFormData["x2s" & i & "xNameVar"]#', 
      #wCreateFormData["x2s" & i & "xid"]#, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x2set1reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x2set1r" & i]))#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x2set2reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x2set2r" & i]))#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x2set3reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x2set3r" & i]))#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x2set4reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x2set4r" & i]))#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x2set5reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x2set5r" & i]))#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x2set6reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x2set6r" & i]))#" /> 
      ) 
     </cfif> 
     <cfif structKeyExists(form, "x3s#i#xID")> 
      ,(#variables.wID#, 
      #wCreateFormData["session" & i]#, 
      '#wCreateFormData["x3s" & i & "xNameVar"]#', 
      #wCreateFormData["x3s" & i & "xid"]#, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x3set1reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x3set1r" & i]))#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x3set2reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x3set2r" & i]))#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x3set3reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x3set3r" & i]))#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x3set4reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x3set4r" & i]))#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x3set5reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x3set5r" & i]))#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#trim(wCreateFormData["x3set6reps" & i])#" maxlength="3" null="#NOT len(trim(wCreateFormData["x3set6r" & i]))#" /> 
      ) 
     </cfif> 

     <!---... you get the idea.....there are 12 total cfif blocks like this ---> 
     <!--- then I end with a ';' in order to close this INSERT statement and go back to the start of the loop for #form.sessions# number of times ---> 

     ; 
     </cfif> 
    </cfloop> 
    </cfquery> 
</cfif> 
+0

你为什么要做''而不是''?我的意思是 - 你*实际上试图发出多个插入语句,不是吗? – Tomalak 2009-08-12 13:29:17

+0

性能 - 尝试避免每次循环迭代时cfquery的开销。出于同样的原因,最好我只是循环VALUES,但保持每个单独的INSERT是第二好的。 – 2009-08-12 13:39:06

+0

无论如何,你正在通过'进行插入。你有没有衡量这个实际影响有多大,还是更多的猜测? – Tomalak 2009-08-12 13:56:41

回答

2

我相信这能代替你的整个代码:

<cfset i_max = 6> 

<cfloop from="1" to="#form.sessions#" index="s"> 
    <!--- do all the 12 blocks you speak of ---> 
    <cfloop from="1" to="12" index="x"> 
    <cfif StructKeyExists(form, "x#x#s#s#xID")> 

     <cfquery name="qCreateXdata" datasource="#application.datasource#"> 
     INSERT INTO table (
      wID, 
      session, 
      xNameVar, 
      xID, 
      <cfloop from="1" to="#i_max#" index="i"> 
      set#i#rt 
      <cfif i lt i_max>,</cfif> 
      </cfloop> 
     ) VALUES (
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#variables.wID#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#wCreateFormData["session" & s]#" />, 
      <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#wCreateFormData["x#x#s#s#xNameVar"]#" />, 
      <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#wCreateFormData["x#x#s#s#xID"]#" />, 
      <cfloop from="1" to="#i_max#" index="i"> 
      <cfqueryparam 
       cfsqltype = "CF_SQL_INTEGER" 
       value  = "#Trim(wCreateFormData["x#x#set#i#reps" & s])#" 
       maxlength = "3" 
       null  = "#Len(Trim(wCreateFormData["x#x#set#i#r" & s])) = 0#" 
      /> 
      <cfif i lt i_max>,</cfif> 
      </cfloop> 
     ) 
     ; 
     </cfquery> 

    </cfif> 
    </cfloop> 
</cfloop> 

提示:尽量减少复制和粘贴的编程,试着找到更多的抽象重复的模式。 ;-)做本质上是一样的东西连续十二次通过复制粘贴应该引发一个大红色的警报。

+0

我同意。因为我试图在规范化和空值数量之间取得平衡,所以我对此很懒惰。 – 2009-08-12 14:11:58

+0

你让我99%的路上。非常感谢和感谢,我欣赏这一课! – 2009-08-13 00:59:49