【问题标题】:insert into table by looping over structure通过循环结构插入到表中
【发布时间】:2018-11-27 23:46:35
【问题描述】:

我正在尝试插入代码,但它是在每一行中插入值,而不是问题中的问题值和答案中的答案值:

<cfset StructDelete(structform,'title')>
<cfset StructDelete(structform,'mode')>
<cfset StructDelete(structform,'formsubmission')>
<cfset StructDelete(structform,'file_upload')>
<cfset StructDelete(structform,'czContainer_czMore_txtCount')>
<CFSET StructDelete(structform,'action')>
<CFLOOP collection="#structform#" index="whichPair">
    <cfset Questions = "question" & structform[whichPair]>
    <cfset answer = "answer" & structform[whichpair]>
    <cfquery name="insertData" datasource="aas">
        insert into faqsquestions(question,answer,createdon,faqID) 
        values(<cfqueryparam cfsqltype="cf_sql_varchar" value="#Right(questions, Len(questions)-8)#">,
        <cfqueryparam cfsqltype="cf_sql_longvarchar" value="#Right(answer, Len(answer)-8)#">,
        <cfqueryparam cfsqltype="cf_sql_date" value="#CreateODBCDate(now())#">,
        <cfqueryparam cfsqltype="cf_sql_integer" value="#getLastID#">)
    </cfquery>
</CFLOOP>
  • 谁能告诉我在这里做错了什么,我知道我在循环内使用问题作为静态值作为cfset 并有权删除没有意义的问题变量,但我会在何时删除它我已经完成了我的代码修复 问题和答案是这样的:

http://prntscr.com/lntu2l

【问题讨论】:

  • 您是如何获得这些数据的? questionanswer 是否都作为表单字段传递?可能有更简单的方法来插入问题,并从表单输入中回答到数据库中。
  • 另外,规范化数据会更好。有一个问题表和另一个表,用于与所提出的问题相关的答案。这让我回到了这个问题,这是为了创建问题和答案,还是在插入一系列问题的答案?
  • 啊,谷歌来救援了。我猜你正在使用 czMore JQuery 插件 (github.com/cozeit/czMore),对吗?那么这是否为问题添加了另一个答案?您发布的图像是您从表单中获得的结构的转储吗?实际上通过form 作用域传递了什么?

标签: coldfusion sql-insert cfloop


【解决方案1】:

对于您正在尝试执行的操作而言,这是错误的循环类型。原因是结构循环迭代一次 - 对于每个字段。当您想要循环一次时 - 对于每个 pair 字段。

一个简单的选项是在表单中添加一个隐藏字段,其中包含对的总数。

<input type="hidden" name="NumberOfQuestions" value="#TheTotalNumberHere#">

然后将总数与fromto 循环一起使用。在每次迭代中,提取问题和答案字段的当前值,并在查询中使用它们:

<cfloop from="1" to="#FORM.NumberOfQuestions#" index="pairNum">
    <cfset question = FORM["question"& pairNum]>  
    <cfset answer = FORM["answer"& pairNum]>  

    <cfquery ...>
        INSERT INTO faqsQuestions(question,answer,createdon,faqID) 
        VALUES (
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#question#">
            ,  <cfqueryparam cfsqltype="cf_sql_longvarchar" value="#answer#">
            ,  <cfqueryparam cfsqltype="cf_sql_date" value="#now()#">
            ,  <cfqueryparam cfsqltype="cf_sql_integer" value="#getLastID#">
        )
    </cfquery>
</cfloop>

【讨论】:

  • 我看到now() 已更改。恕我直言,如果要更改,则应在 SQL 端将其替换为 getDate()
  • @JamesMohler - 只是好奇,但为什么呢?由于他们使用的是 DATE,因此 CreateODBCDate 已被删除,因为它是多余的。虽然如果 CF 服务器与 db 服务器相同,则同意它可以采用任何一种方式。
  • CF now() vs SQL getDate() 几乎是一场哲学辩论。使用 SQL 创建日期将比应用程序使用更少的资源,但由于它们在技术上是不同的日期(并且很容易不同),因此您的应用程序的需求将确定最适合使用的日期。除非您以 UTC 跟踪该日期,否则两者的日期将相同,我肯定会使用 SQL。
  • @Shawn - 你为什么说得更多?从来没有真正深入研究这些差异,因为 UTC 问题对我来说更重要。
  • @Ageax 我猜“显着”是一种相对的,但是对于now(),CF 必须生成值,然后它必须执行参数化魔法(包括它自己的验证),然后它必须将该值传递给查询,然后 SQL 必须从 CF 获取该值并神奇地验证数据类型并插入该值。使用getDate(),SQL 只是自己计算值并插入数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2020-07-07
  • 2020-11-28
  • 2020-11-11
  • 1970-01-01
  • 2012-06-04
相关资源
最近更新 更多