4

我在一个 CF 站点上工作,需要从 MySQL 表中获取数据。

我可以很好地创建 CFQuery 并检查返回的记录,但是如何获取返回的记录并循环遍历它们并从每一行的特定字段中获取数据。

我可以写 if/end if 等,我只是不记得如何访问数据。

-杰森

4

5 回答 5

10

假设您使用 firstname 列进行了名为 the_query 的查询:

<cfoutput query="#the_query#">
   #firstName# ... etc <br>
</cfoutput>
于 2009-01-09T19:15:42.203 回答
8

所有现有的答案/评论似乎都涉及不同的方面,因此这是一种尝试将所有这些信息整合到一个清晰的解释中。
(此答案设置为社区 wiki - 请酌情编辑。)


要从查询中访问变量,请使用:

QueryName.ColumnName[RowNum]
QueryName["ColumnName"][RowNum]

这些都将在创建查询后的任何时候起作用。
两者都可以在内部使用cfoutput来显示变量,或者在内部cfset分配变量。

第二个对动态变量很有用,并且可以接受如下变量:

QueryName[DynamicColumnName][RowNum]
QueryName["Partial#DynamicName#"][RowNum]
QueryName["Partial"&DynamicName][RowNum]

为方便起见,而不是手动循环查询:

<cfloop index="CurrentRow" from="1" to="#QueryName.RecordCount#">
    <cfoutput>#QueryName.ColumnName[CurrentRow]#</cfoutput>
</cfloop>

你可以简单地做:

<cfloop query="QueryName">
    <cfoutput>#QueryName.ColumnName[CurrentRow]#</cfoutput>
</cfloop>

作为进一步的捷径,您可以执行以下操作:

<cfoutput query="QueryName">
    #QueryName.ColumnName[CurrentRow]#
</cfoutput>

而且,当在 a<cfloop query="">或 a中时,<cfoutput query="">您可以简单地执行以下操作:

<cfoutput query="QueryName">
    #ColumnName#
</cfoutput>

但是,最后一个快捷方式仅用于显示 - 如果您这样做:

<cfset ColumnName = "NewValue" />

这不会修改原始查询数据。相反,您需要执行以下操作:

<cfset QueryName.ColumnName[CurrentRow] = "NewValue" />

这将修改查询的结果(但不会修改数据库中的值)。


要显示已运行的实际 SQL 查询,使用 CF8(也包括 Railo 和 OpenBD),您可以执行以下操作:

<cfdump var="#QueryName#"/>

它将向您显示查询的结果和已运行的实际 SQL。

要使用 CF7 显示实际 SQL,您需要在标签中添加一个result="QueryInfo"cfquery然后<cfdump var="#QueryInfo#"/>将显示 SQL。

于 2009-01-09T20:40:26.340 回答
5

或者,您可以使用 CFLOOP 标签达到类似的效果

例如,假设您想对数量大于零的那些行的“价格”字段求和。(想象一个购物车)

<CFSET TOTAL=0>
<CFLOOP QUERY="the_query">
    <CFIF quantity gt 0>
        <CFSET TOTAL=TOTAL+PRICE>
    </CFIF>
</CFLOOP>

顺便说一句,不鼓励在 CFOUTPUT Query 参数中使用井号/井号/八字

[编辑:] 要转储查询堆栈的内容,请在 "<!--- :: CFTimer :: --->" 行之前添加到 [cf_root]\wwwroot\WEB-INF\debug.cfm:

<CFIF IsDefined("DumpQueries") >
    <cfset DQ_Queries= QueryToArray( CFDEBUG_QUERIES ) />    
    <CFLOOP From="1" to ="#CFDEBUG_QUERIES.recordcount#" index="i">
        <CFSET DQ_Queries[i].BODY =  DQ_Queries[i].BODY >
        <CFSAVECONTENT Variable="dump_content">
        <CFDUMP Var="#DQ_Queries[i]#" Expand="NO" Label="#DQ_Queries[i].NAME#">
        </CFSAVECONTENT>
        <CFOUTPUT>#REReplaceNoCase(dump_content,"expand"">BODY</td>[[:space:]]*<TD>[[:space:]]*","expand"">BODY</td><td><PRE>")#</CFOUTPUT>     
    </CFLOOP>
</CFIF>
于 2009-01-09T19:21:15.003 回答
2

有很多方法可以做到这一点。如上所述,您可以将 cfoutput 与查询属性一起使用。您还可以引用“queryname.columnname”。

如果您需要访问特定的行/列,可以使用数组表示法,如下所示:

queryname.columnname[rownum]

(请记住,CF 从 1 开始计数,而不是 0)。对于动态列访问,您可以使用

queryname[columnvariable][rownum]

如果您的列名是 CF 中的非法变量名(如 8thCol),您可以稍微修改一下:

queryname['8thCol'][rownum]

希望有帮助。

于 2009-01-09T19:30:42.330 回答
0

一旦在 CFQUERY 中定义了查询,就可以将结果放入 CFOUTPUT 标记中。您可以使用语法 #[query name].[field name]# 指定要显示的字段。

于 2009-01-09T19:20:46.033 回答