<cfquery>タグを使ってデータベースからデータを抽出する際に用いるSQLの一部、またはSQL全体をColdFusionを使って動的に指定することができます。これによってユーザーがフォームで入力したデータに限定したデータを取得したり、特定の条件の時にのみデータを絞り込んで取得するなど、動的なクエリ処理が可能です。
<cfquery datasource="データソース名" name="クエリ名">
select * from テーブル名
<cfif 条件式1>
where 列名=<cfqueryparam cfsqltype="列のタイプ(Varchar, Integer 等)" value="#変数値#" list="yes|no" />
</cfif>
</cfquery>
※SQL文の一部に変数を用いて動的な値を指定する際は、セキュリティ上の観点から上記のように<cfqueryparam>を使用する方法が推奨されています。<cfqueryparam>の詳細については、『ColdFusion 10 アプリケーションの開発 - cfqueryparam によるセキュリティの強化』をご覧下さい。
ColdFusionのサンプルデータベース(cfartgallery)には、注文情報データが格納されている「ORDERSテーブル」と注文状況(支払い済、発送済、他)データが格納されている「ORDERSTATUSテーブル」があり、その2つのテーブルは、ORDERSTATUSID列で関連付けられています。
ORDERSテーブルのデータをオーダーの状況で絞り込んで取得する場合、まず、ユーザーにどの状況を確認したいかを決定させる必要があります。そこで ユーザーに注文状況を選択させるForm画面を作成します。以下の内容でページを作成します。
<cfform action="order_action.cfm"> <cfselect name="order"> <option value="all">すべて表示する</option> <option value="1">pending</option> <option value="2">complete</option> <option value="3">shipped</option> <option value="4">billed</option> <option value="5">paid</option> </cfselect> <cfinput type="submit" name="submit" value="注文情報の確認"> </cfform>
上記のページをリクエストすると、下記のように注文状況を選択するセレクトリストが表示されます。送信(SUBMIT)ボタンを押すと、order_action.cfmページにサブミットされます。
送信(SUBMIT)先では、受け取ったForm変数の値を利用して、「ORDERS」テーブルから orderid, customerfirstname, customerlastname の列の値を取得します。データベースの「orderstatusid」列の値と Form変数「order」の値と使ってデータを絞り込みます。取得結果を画面に一覧表示する例を紹介します。
<cfquery datasource="cfartgallery" name="qOrders"> SELECT orderid, customerfirstname, customerlastname FROM ORDERS WHERE orderstatusid = <cfqueryparam cfsqltype="cf_sql_integer" value="#Form.order#" /> </cfquery> <table border="1"> <tr> <th>オーダーID</th> <th>名前</th> <th>苗字</th> </tr> <cfoutput query="qOrders" > <tr> <td>#qOrders.orderid#</td> <td>#qOrders.customerfirstname#</td> <td>#qOrders.customerlastname#</td> </tr> </cfoutput> </table>
注文状況の選択画面に戻り、[complete]を選択して送信(SUBMIT)ボタンを押すと、下記のように該当する注文状況(orderstatusid)一覧が表示されます。
次に、注文状況の選択画面で[すべて表示する]を選択して送信(SUBMIT)ボタンを押して見ると、下記のようなエラーが発生して処理が中断します。
本来行いたい動作は、注文状況に関係無くすべての注文の情報を表示したいのですが、今のプログラムだと、[すべて表示する]を選択した際に送信される「all」という文字をSQLの条件文の値に指定する動きになっています。そこでForm変数の値が「all」だった場合は、絞り込みを行わないようにプログラムを修正します。
<cfquery datasource="cfartgallery" name="qOrders"> SELECT orderid, customerfirstname, customerlastname FROM ORDERS <cfif Form.order IS NOT "all"> WHERE orderstatusid = <cfqueryparam cfsqltype="cf_sql_integer" value="#Form.order#" /> </cfif> </cfquery>
最後に、注文状況の選択画面で[billed]を選択して送信(SUBMIT)ボタンを押して見ると、テーブルのヘッダだけが表示されます。これは、注文の情報テーブルには、注文状況がbilledのデータが一件も無かった事になります。テーブルのヘッダだけが表示されるのは見た目にも分かりづらいので、データベースから結果が戻ってこなかった場合の処理を追加します。データベースからのデータをHTMLテーブルで表示している箇所に<cfif>の条件分岐を追加しましょう。
<cfif qOrders.RecordCount> <table border="1"> <tr> <th>オーダーID</th> <th>名前</th> <th>苗字</th> </tr> <cfoutput query="qOrders" > <tr> <td>#qOrders.orderid#</td> <td>#qOrders.customerfirstname#</td> <td>#qOrders.customerlastname#</td> </tr> </cfoutput> </table> <cfelse> 選択した注文状況のデータはありません。 </cfif>
これで、データベースから結果が一件も無かった場合にメッセージを表示することができるようになりました。
■ColdFusion Builderの RDS Dataviewを使用すると、ColdFusion Administratorで登録されているデータソースの一覧や、データベース情報(カラム列情報やデータのプレビュー)が参照できます。
@ RDS Dataview表示アイコン
A データベースデータをプレビューしたいテーブルを右クリックして「Show Table Contents」を選択します。
B 選択したテーブルのデータがプレビューされます。(レコード数が多い場合は50行までプレビューが行えます)