【问题标题】:Where to put a cfquery in a Coldfusion Form在 Coldfusion 表单中放置 cfquery 的位置
【发布时间】:2013-03-22 18:50:15
【问题描述】:

我有一个cfquery,它在WHERE 子句中使用了一些FORM 字段。我的第一个问题是每次访问我的网页时,cfquery 代码都会出现在页面顶部。我应该将查询放在 .cfm 表单中的什么位置并访问表单中的某些字段?我的第二个问题是我不确定WHERE 子句是否识别字段的值。你能帮帮我吗?

这是我的代码设置方式:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<script language="javascript" type="text/javascript">
function addRow() { 
     var tbl = document.getElementById('tblSample');
     var lastRow = tbl.rows.length; 
     var iteration = lastRow - 3;
     var row = tbl.insertRow(lastRow);
     ........... etcetra.......
}
</script>
</head>
<body lang=EN-US style='tab-interval:.5in'>
<div class=Section1>
<cfparam name="awardTotals" default="0" />
<cfparam name="search_award.GrandTotal" default="0" />
<cfif isDefined("form.Finalize")>
   <cfquery name="search_award" datasource="Test">
    SELECT g.Code1 + g.Code2 + g.Code3 + g.Code4 AS GrandTotal
      FROM Codes g 
     WHERE g.CodeNumber = <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.CodeNum#">
       AND g.TestYear = <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.TestYear#">
       AND g.SelType = <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.SelType#"> 
       AND g.Jurisdiction = <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.SelJuris#">    
   </cfquery>
   <cfif not search_award.GrandTotal is FundingTotals>
      <script type="text/javascript">
         alert('The totals do not match.');
   return false;       
</script>
   <cfelse>
<script type="text/javascript">
   alert('The totals match.');
   return true;
</script>      
    </cfif>
</cfif>
<p class=MsoNormal align=center style='text-align:center'><
<cfoutput>
  <form name="thisform" action="FormData.cfm" method="post">
    <p class=MsoNormal align=left style='text-align:left'>
      <input type="hidden" id="totalFields" name="totalFields" value="0">
      <input type="text" id="awardTotals" name="#search_award.GrantTotal#" value="0">
      <table width="1177" border="1" id="tblSample">
          <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
          <th height="10"bgcolor="##cccccc" colspan="10"><h3>Jurisdiction:
             <select name="SelJuris" id="SelJuris">
                <option value = "0">---Jurisdictions---</option>
                <option value = "1">Allegany County</option>
                <option value = "2">Anne Arundel County</option>
                <option value = "3">Baltimore County</option>
                <option value = "4">Calvert County</option>
                <option value = "5">Caroline County</option>
             </select>
             <input name="CodeNum" id="CodeNum" type="text" size="20">  
             <input name="TestYear" id="TestYear" type="text" size="20"> 
             <input name="SelType" id="SelType" type="text" size="20">  
          </th>
          </tr>
</table>
<input type="Submit" name="Submit Form" value="Submit Form" onClick="">
<input type="Button" name="Finalize" value="Finalize" onClick="">
</form>
</body>
</cfoutput>
</html>

(来自 cmets 的更新)

现在我收到一条消息,Element CODENUM is undefined in FORM

【问题讨论】:

  • 您的coldfusion代码是在显示还是因为它正在尝试执行而出现错误?
  • 现在我收到一条消息,说我的元素代码在 FORM 中未定义。
  • 与您的直接问题无关,但总的来说,我可以进行以下观察吗:1)将数据库/业务逻辑与显示逻辑混为一谈并不是编写代码的好方法。我可以推荐你阅读 MVC 吗? 2) 永远不要将用户的值硬编码到您的 SQL 字符串中。绝不。使用 CFQUERYPARAM 标记。
  • @AdamCameron 我刚开始使用 CF,在使用它时我还没有意识到 MVC 分离规则。 CF 在与 DB 的交互方式上非常精简,因此很容易违反它们。我想可以实现控制器的一种方法是通过命令文件(cfc)中定义的函数。确实很好!
  • @SamusArin CFML 的易用性以及它的记录方式有点鼓励不合标准的做法,不幸的是。如果您需要反馈其他 CFMLers 的想法,请务必加入 CFML Slack 频道:cfml-slack.herokuapp.com

标签: coldfusion cfquery


【解决方案1】:

你想要这种逻辑。如果表单已提交,请对其进行处理。在你的情况下,它会是这样的:

<cfif structkeyexists(form, "codenum")>
 query, process, display, etc
<cfif>
rest of page

此外,出于各种原因,您希望使用查询参数。所以这个:

g.CodeNumber = '#form.CodeNum#'

变成这样:

g.CodeNumber = <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.CodeNum#">

除非它是一个数字,在这种情况下您更改数据类型。

【讨论】:

  • 现在我收到此错误:在 SEARCH_AWARD 中未定义元素 GRANDTOTAL。错误在这行代码上:
  • @tnbumbray - 查询仅在提交表单时运行。所以你需要在访问它之前验证它是否存在,即structKeyExists(variables, "yourQueryName")&gt;或者设置一个默认值,所以它总是存在的。也就是说,您的表单流程似乎是正确的。您正在使用form 字段运行查询,然后使用查询填充form 字段..?似乎是圆形的......
  • 这里发生了一些鸡和蛋的场景。您的查询不能同时需要来自同一表单的数据,也不能同时填充表单中的总计数据。您可能必须将其分为 2 个步骤或使用 CFPARAM 为 search_award.grandtotal 设置默认值以避免这种情况。
  • 其实我想使用表单字段来查找GrandTotal,然后将GrandTotal 与另一个字段进行比较。如果总数匹配,我将继续。
  • 您可能希望将@Dan 的答案标记为正确,因为他确实正确回答了您的问题。
【解决方案2】:

您需要在 cfquery 周围添加一个条件。同时更新提交按钮的名称,不带空格

<input type="Submit" name="SubmitForm" value="Submit Form" onClick="">



   <cfif isDefined("form.SubmitForm")>

          <cfquery name="search_award" datasource="TrenaTest">
               SELECT g.Code1 + g.Code2 + g.Code3 + g.Code4 AS GrandTotal
                FROM Codes g 
              WHERE g.CodeNumber = '#form.CodeNum#'
              AND g.TestYear = '#form.TestYear#'
              AND g.SelType =  '#form.SelType#'
              AND g.JurisdictionID = '#form.SelJuris#'  
         </cfquery>

    </cfif>

【讨论】:

  • 我以这种方式尝试了代码,但是当我单击按钮时,我认为我的代码无法识别。
【解决方案3】:

请注意,在所有示例中,都使用了标准的 html 表单标签,但查询的条件是在 Coldfusion 表单范围内定义的。我相信您需要将&lt;form&gt; 转换为&lt;cfform&gt;&lt;input&gt; 转换为&lt;cfinput&gt;,例如:

      ...........
<cfinput type="Submit" name="SubmitForm" value="Submit Form" onClick="">
</cfform>
<cfif isdefined('form.submit')>
      .............

【讨论】:

  • 抱歉@bphillips,ColdFusion 表单范围适用于表单和 cfform 标记。 cfform 所做的只是启用一些客户端验证
  • Thx... 我同意它只是 HTML 控件的包装器。我不准确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 2012-10-29
  • 2019-01-26
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多