我正在使用CF站点,需要从MySQL表中获取数据。
我可以创建CFQuery并检查返回的记录,但是如何获取返回的记录并循环遍历它们并从每行的特定字段中获取数据。
我可以写if if / end if等,我只是不记得如何访问数据。
-Jason
答案 0 :(得分:10)
假设您使用firstname列创建了一个名为the_query的查询:
<cfoutput query="#the_query#">
#firstName# ... etc <br>
</cfoutput>
答案 1 :(得分:8)
所有现有的答案/评论似乎涉及不同方面,因此这是尝试将所有这些信息合并为一个明确的解释。
(此答案设置为社区维基 - 请根据需要进行编辑。)
要从查询中访问变量,请使用:
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>
而且,当您在<cfloop query="">
或<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。
答案 2 :(得分:5)
或者,您可以将CFLOOP标记用于类似的效果
比如说,您想要对数量大于零的行的“价格”字段求和。 (想象一下购物车)
<CFSET TOTAL=0>
<CFLOOP QUERY="the_query">
<CFIF quantity gt 0>
<CFSET TOTAL=TOTAL+PRICE>
</CFIF>
</CFLOOP>
顺便说一句,在CFOUTPUT查询参数中不鼓励使用散列标记/井号/ octothorpes
[编辑:] 要转储查询堆栈的内容,请在“&lt;!--- :: CFTimer :: ---&gt;”之前添加到[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>
答案 3 :(得分:2)
有很多方法可以做到这一点。如上所述,您可以将cfoutput与query属性一起使用。您还可以引用'queryname.columnname'。
如果需要访问特定的行/列,可以使用数组表示法:
queryname.columnname[rownum]
(记住,CF从1开始计数,而不是0)。 对于动态列访问,您可以使用
queryname[columnvariable][rownum]
如果你的列名是CF中的非法变量名(如8thCol),你可以稍微修改一下:
queryname['8thCol'][rownum]
希望有所帮助。
答案 4 :(得分:0)
一旦在CFQUERY中定义了查询,就会将结果放在CFOUTPUT标记中。您可以使用语法#[查询名称]指定要显示的字段。[字段名称]#。