ColdFusionカフェテリア
SAMURAIZ

 

←前 | ↑一覧 |

フォームから送信された値を使ってデータを絞り込む

<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行までプレビューが行えます)

ColdFusionの各種情報の配信


最新情報
■2017/6/26
『ColdFusion 実験室』
実験6

■2017/3/27
ColdFusion 2016 対応
インストール セットアップ情報
CFサーバーのインストール
CFビルダーのインストール

■2016/9/20
『ColdFusion 2016 リリース
Enterprise Edition 活用資料』
記事一覧

■2016/3/30
『ColdFusion 実験室』
実験4、実験5

■2015/8/10 〜
『ColdFusion クリニック』
記事一覧(随時更新中)

■2015/4/8
『JasperReportsによる帳票出力』
2. JasperReportsによる帳票出力【後編】

■2015/3/12
アップクロス株式会社
西元 貞昭様
『JasperReportsによる帳票出力』
1. JasperReportsによる帳票出力【前編】


■2015/2/25
『ColdFusionでエクセルを使いこなそう!』
4. 【上級】ColdFusionのエクセル機能を利用したPDF帳票の紹介

ColdFusionトレーニング


ColdFusionユーザーグループ
ColdFusionユーザーグループ
Copyright 2012 Samuraiz Corporation. All Rights Reserved.