CF サイトで作業しており、MySQL テーブルからデータを取得する必要があります。
CFQuery をうまく作成して、返されたレコードを確認することはできますが、返されたレコードを取得してループし、各行の特定のフィールドからデータを取得するにはどうすればよいでしょうか。
if/end if などを書くことができますが、データへのアクセス方法を思い出せません。
-ジェイソン
CF サイトで作業しており、MySQL テーブルからデータを取得する必要があります。
CFQuery をうまく作成して、返されたレコードを確認することはできますが、返されたレコードを取得してループし、各行の特定のフィールドからデータを取得するにはどうすればよいでしょうか。
if/end if などを書くことができますが、データへのアクセス方法を思い出せません。
-ジェイソン
firstname 列を持つ the_query という名前のクエリを作成したと仮定します。
<cfoutput query="#the_query#">
#firstName# ... etc <br>
</cfoutput>
既存のすべての回答/コメントはさまざまな側面に触れているように見えるため、これはこのすべての情報を 1 つの明確な説明に統合する試みです。
(この回答はコミュニティ wiki に設定されています。必要に応じて編集してください。)
クエリから変数にアクセスするには、次を使用します。
QueryName.ColumnName[RowNum]
QueryName["ColumnName"][RowNum]
これらは両方とも、クエリが作成された後の任意の時点で機能します。
どちらも内部で使用cfoutput
して変数を表示したり、内部でcfset
変数を割り当てたりできます。
2 番目のものは動的変数に役立ち、次のような変数を受け入れることができます。
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" />
これにより、クエリの結果が変更されます (ただし、データベースの値は変更されません)。
CF8 (Railo と OpenBD も) で実行された実際の SQL クエリを表示するには、次のようにします。
<cfdump var="#QueryName#"/>
また、クエリの結果と実行された実際の SQL の両方が表示されます。
CF7 で実際の SQL を表示するには、タグに を追加する必要がありresult="QueryInfo"
ますcfquery
。その後<cfdump var="#QueryInfo#"/>
、SQL が表示されます。
または、CFLOOP タグを使用して同様の効果を得ることができます。
たとえば、数量がゼロより大きい行の「価格」フィールドを合計したいとします。(ショッピングカートを想像してください)
<CFSET TOTAL=0>
<CFLOOP QUERY="the_query">
<CFIF quantity gt 0>
<CFSET TOTAL=TOTAL+PRICE>
</CFIF>
</CFLOOP>
ちなみに、CFOUTPUTクエリパラメータでは、ハッシュマーク/シャープ記号/オクトソープの使用は推奨されていません
[編集:] クエリ スタックの内容をダンプするには、[cf_root]\wwwroot\WEB-INF\debug.cfm の "<!--- :: CFTimer :: --->" 行の前に追加します。
<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>
これを行うにはいくつかの方法があります。上記のように、query 属性を指定して cfoutput を使用できます。「クエリ名.列名」を参照することもできます。
特定の行/列にアクセスする必要がある場合は、配列表記を次のように使用できます。
queryname.columnname[rownum]
(CF は 0 ではなく 1 から数えます)。動的列アクセスの場合は、次を使用できます
queryname[columnvariable][rownum]
columname が CF で不正な変数名 (8thCol など) である場合は、これを少し変更できます。
queryname['8thCol'][rownum]
それが役立つことを願っています。
CFQUERY 内でクエリを定義したら、結果を CFOUTPUT タグ内に配置します。構文 #[クエリ名].[フィールド名]# を使用して、表示するフィールドを指定します。