ColdFusion

Page 1

���クリエイターのための

真木みお 著


著作権法の例外を除き、本書の全部あるいは一部 を無断で複製・転載・配信・送信・送信可能化す ることを禁じます。なお、ホームページ上におけ る掲載、オークション販売等は一切禁止します。     当社は、上記違法利用等が行われないよう、常 にネット上に注意を払っています。著作者の権利 などを守るため、該当事例を発見した場合は、法 的措置を含み断固とした対応をとることがありま すのでご注意下さい。


Webクリエイターのための

真木みお 著


CD-ROM収録ファイルの提供方法について PDF版の『WebクリエイターのためのColdFusion入門』では、書籍付属のCD-ROM 収録ファイルと同等のものを、[CF_cd-rom]フォルダに収録して提供しています。 ● サンプルソースコード([source]フォルダ) ● サンプルデータベース([database]フォルダ) ● ColdFusion Server 5 Enterprise Edition 日本語トライアル版Windows ([cfusion]フォルダ) ● ColdFusion 5 日本語版評価ガイド([guide]フォルダ) ファイルの詳細については、 「付属CD-ROMについて」のページを参照してください。

Macromedia、ColdFusionはMacromedia, Inc.の登録商標です。 Microsoft、Windowsは、米国Microsoft Corporationの登録商標です。 その他、本文中の製品名およびサービス名は、一般に各開発メーカーおよびサービス提供元の商標 または登録商標です。 なお、本文中には™および®マークは明記していません。


はじめに 本書を目にしてはじめに、『ColdFusionって何だろう!?』と思われたでしょう か? これは、米国では相当数の導入実績を持っているのですが、日本では2001 年現在、ある程度の企業に導入はされているものの、何故か知名度の低いWeb アプリケーションサーバーなのです。元々Allaire社の製品であったのですが、 2000年のMacromedia社、Allaire社の合併により、現在はMacromedia社の製品 となっています。著者自身も実は単身でアメリカに渡るまで知らなかったのです が、とあるきっかけでCFMLというColdFusionの言語を使うようになってから、 これはもっと日本で普及させるべきアプリケーションだと強く思ったと同時に、 日本国内でこれに関する書籍が1、2冊しかないという現状を知り、本書を執 筆するに至ったわけです。著者自身も米国で執筆を始めた際、プログラミングの 経験は若干あるとはいえ、ColdFusionに関してはまったくの初心者でしたが、 それゆえ、初心者の心がわかるということで、初心者向けに書き上げたものを日 本に持ち帰って、加筆修正し仕上げました。ですから、すでに開発者として ColdFusionを利用している方には、本書は退屈なものであるかもしれません。 しかし、目標はColdFusionの普及にあります。よってColdFusionのさわりの部 分をまだHTMLの基礎しか知らないという方にも知っていただくためには、とて も有効なものになると信じております。もちろん、まったくHTMLがわからない 場合は少々理解に苦しむと思いますので、その部分はHTMLに関する著書を参 考にして欲しいと思います。 本書は全5章で構成し、第2章、第3章に組み込んでいる「タグ」の紹介を メインに基礎的な部分の習得を目的としております。ものすごい勢いでインター ネットの普及が進んでいる今日、魅せるホームページをより早く簡単に作成する ためのツールとしてColdFusionが選択された際に、本書が少しでも皆さんのお役 に立てばなによりです。また将来日本のプロバイダーがそのホスティングサービ スでColdFusionを当たり前にサポートするようになり、個人ユーザーでもとても 充実したホームページの作成が可能になる未来の日本を夢見ております。 2002年3月 著者


付属CD-ROMについて 付属CD-ROMの内容 本書付属のCD-ROMには以下のものが含まれます。 ●

サンプルソースコード( [source]フォルダ)

サンプルデータベース( [database]フォルダ)

ColdFusion Server 5 Enterprise Edition 日本語トライアル版 Windows

([cfusion]フォルダ) ●

ColdFusion 5 日本語版 評価ガイド( [guide]フォルダ)

サンプルソースコードについて 付属CD-ROMには本書で紹介するサンプルのソースコードが収録されています。本書 を理解するには実際にソースコードを初めから記述することをおすすめしますが、記述し たものが動作しない場合など、付属CD-ROMのソースコードと比べてみてください。 また、これらのサンプルコードの著作権は、本書の著者である真木みお氏に帰属しま す。本書を読み進める補助として個人的に使用する場合を除き、著作権者に無断で再利 用および転載することは禁じられています。

サンプルデータベースについて 本書の第3章以降で使用するMicrosoft Accessのデータベースファイル(sample.mdb) がCD-ROMに収録されています。このファイルを利用すれば、Microsoft Accessがインス トールされていないコンピュータであっても、本書を読み進めることができます。 sample.mdbをハードディスクの任意の場所にコピーし、第3章の手順に従ってください。 また、このサンプルデータベースを利用するには、次に説明する方法でファイルの読み取 り専用属性を解除する必要があります。

読み取り専用属性について CD-ROMからファイルをコピーした場合、それらのファイルに読み取り専用属性が付 けられます。読み取り専用属性を解除しないと書き込みができませんので、右ページの手 順で操作してください。

4


1. ファイルを右クリック 2.[プロパティ] をクリック

3. [読み取り専用]をクリッ クしてチェックをはずす

ColdFusion Server 5 Enterprise Edition 日本語トライアル版 Windowsについて 付属CD-ROMに収録されているトライアル版は評価目的に使用することができます。 トライアル版を利用して商用もしくは営利目的に利用することはできません。また、マク ロメディア株式会社のテクニカルサポートを受けることはできません。

システム条件 ColdFusion Server 5 Enterprise Edition 日本語トライアル版 Windows Intel Pentium II プロセッサ以上(Pentium III プロセッサ以上推奨) Microsoft Windows NT 4.0 日本語版 SP4/Windows 2000 日本語版 256 MB 以上の空きメモリ(512 MB 以上推奨) 350 MB 以上の空きハードディスク容量

ColdFusion 5 日本語版 評価ガイドについて 評価ガイドとは、マクロメディア株式会社によりPDFにて発行されている解説書です。 評価の方法や製品の解説、チュートリアルなどから構成されています。本ガイドを見るに はアドビシステムズ株式会社(http://www.adobe.co.jp/)のAcrobat Readerが必要です。

5


目 次

はじめに _______________________________3 付属CD-ROMについて ________________________4 目次 _________________________________6

第1章 まず、知っておくこと<ColdFusionの基本> _________11 1-1 ColdFusionって一体何もの?<ColdFusionの概要> ______12

1-2 ColdFusionの魅力<特徴> ___________________20

1-3 ColdFusionの生い立ち<歴史と背景> ______________22

コラム Flash 5との連携で実現させる動的なWebページ ________26

第2章 CFMLのテイスティング<CFMLの基本> ___________27 2-1 データの出力<CFOUTPUT> _________________28

2-2 テンプレートの呼び出し<CFINCLUDE> ____________32

2-3 フォームを利用する<CFFORM> ________________36

2-4 条件分岐<CFIF/CFELSEIF/CFELSE> ____________44

コラム 新タグCFFLUSH ______________________52

6


目 次

第3章 データベースをスパイスに<データベースとの連携>_______53 3-1 データベースを利用するための準備 <データソースの登録> ____________54

3-2 データベースとの連携<CFQUERY> ______________58

3-3 テーブルの利用<CFTABLE>__________________66

3-4 データベースへのデータの追加<CFINSERT> __________72

3-5 データベースの更新<CFUPDATE> ______________80

ちょっと休憩 ____________________________102

3-6 ダイナミックドキュメント<CFLOCATION>__________104

3-7 変数を定義する<CFSET/CFPARAM> ____________107 3-8 インデックスループとクエリループ <CFLOOP/CFBREAK> ____________111

3-9 条件文<CFSWITCH/CFCASE> _______________117

3-10 ファイルの対話処理<CFFILE> _______________121

ちょっと休憩 ____________________________136

コラム SQLの基礎知識 _______________________140

7


目 次

第4章 探し物は何ですか?<検索> _________________141 4-1 データベースの検索<CFQUERYによる検索> _________142

4-2 サーチエンジン<サイト内全文検索> ______________148

コラム 新機能! Verity K2 Server ________________164

第5章 美味しいWebページのできあがり <実用的なWebページ作成> __________165 5-1 第5章の事前準備<メールサーバーの登録> ___________166

5-2 Cookie(クッキー)の発行<Cookie変数> __________168

5-3 セキュアなサイトへのログイン<ログイン認証> _________173

5-4 Webページからメールを送る<メール送信> ___________184

5-5 ちょっと本格的なページ<応用編> _______________190

ちょっとお遊び ___________________________208

コラム 「あとがき」のようなもの…。_________________216

8


目 次

付録________________________________217 付録1 IISのインストール ______________________218

付録2 ColdFusion Server 5のインストール ____________224

付録3 Webページ作成の準備 ____________________244

索引________________________________249

9


目 次

10


まず、知っておくこと ColdFusionの基礎知識 本章では、「ColdFusionとはなにか?」というこ とに焦点を当て、その特徴や何をすることができ るのかについて述べ、最後にColdFusionの歴史に ついて紹介します。

1


1-1 ColdFusionって一体何もの?〈ColdFusionの概要〉 ColdFusionとは Webページをすばやく創れて“魅せる”ことができるのがColdFusionって言っ ているけど、一体これは何もの?パソコンさえ持っていれば、そのパソコンだけで 誰でも遊べるものなの?という疑問をもった人はいるでしょうか。この疑問に対す る回答は、「No」で、パソコンだけじゃ扱えないです。ColdFusionとは、サーバ ーサイドアプリケーション、つまり、WebコンピューティングをベースにしたWeb アプリケーションサーバーを意味します。ここでいうWebコンピューティングとは、 クライアントとサーバーとのやりとりを単純にHTTPとHTMLで行うことを意味し ています。このアプリケーションサーバーを利用するためには、まずWebサーバー を準備し、そこにColdFusionサーバーをインストールして利用します。

■図1-1-1 ColdFusionはWebサーバーの上で動作する

ColdFusion Server Webサーバー

HTML

12

HTTPリクエスト

CFMLで書かれた Webページ


1章 まず、知っておくこと

ColdFusionを使うには では、実際どのような環境で、ColdFusionを使うかというと、以下の2つのケ ースが考えられます。

1) 自分のパソコンでColdFusionの体験をする場合 まず『ColdFusionがどのようなものなのか、自分のパソコン上で試してみよう』 と思う場合です。この場合、実際に踏むステップは以下の通りです。

1-1) 自分のパソコンをWebサーバーにする たとえばIISなどのWebサーバーを自分のパソコンにインストー ルする(インストール方法については、付録を参照してください)。

1-2) ColdFusionサーバーをインストールする 次に、本書に添付されているCD-ROMからColdFusionサーバー をインストールする(インストール方法については、付録を参照 してください)。

1-3) CFML でのコード作成 今度は、パソコン上で、CFMLと呼ばれるコードを作成して、適 切なディレクトリに、作成されたファイルを置き、ColdFusion を動かしてみる。 以上の手順で、とりあえずColdFusion 体験ができるわけです。本書の読者の 皆さんには、まず、この手順を踏んでいくことをお薦めします。

2) CFMLで作成したホームページを一般公開する場合 次に、 『もうColdFusionの使い勝手もよくわかったし、ぜひインターネット上で これを使ったホームページを公開したい』という場合は、さらに次の2つのパター ンが想定されます。

13


2-1) 既に公開用のWebサーバーを自前で持っている場合 この場合は、もうただ単に、ColdFusionサーバーを既存のWebサーバーにイン ストールし、CFMLでファイルを作成して公開すればいいだけですね。

2-2) ISPのWebサーバーを借りる場合 自前でサーバーを持っていない場合は、ColdFusionをサポートしているISP (Internet Service Provider)のWWWサーバーを借り、そこで公開するという手 段があります。

CFMLって? C oldF F usion M arkup L anguage」の略で、HTMLに似 このCFMLというのは「C たタグベース言語です。以下にサンプルを示します。

■CFMLを使ったページのソース <html> <head> <title>サンプル</title> </head> <body> <h3>日本時刻で現在が1年のうちの何日目なのかを表示する</h3> <hr> <cfset current = now()> <h3> <cfoutput>#Dayofyear(current)#</cfoutput> 日目です。 </h3><br> </body> </html>

14


1章 まず、知っておくこと

CFMLのタグの場合、「CF」 という文字でそのタグが始まると考えて間違いな いでしょう。この例の場合、濃く表されている2行、つまり、<cfset .....> という 行と、<cfoutput>......</cfoutput>という行が、これにあたります。CFMLは、こ のように、HTMLと似たような感覚でコードを書くことができる上、CFML部分に ついては、サイトのソースには反映されず空欄で表示されますので、コードを盗ま れる心配もありません。つまり、たとえば「インターネットエクスプローラー」を ブラウザとして利用していた場合、メニューバーに[表示]-[ソース]というコ マンドがありますが、そこをクリックしてもCFMLで書いた部分はソースに出てこ ないということを意味します。図1-1-3はそれを示したものです。

■図1-1-2 サンプルをWebブラウザで表示した画面

15


■図1-1-3 Webブラウザからソースを表示した画面

ColdFusionでできること では、具体的にColdFusionで何ができるのかというのは第2章以降をみていた だけると理解が早いと思いますが、たとえば、簡単なところからいうと、ブラウザ 上でのデータベーステーブルの読み書きや、ブラウザ上からのメール送受信である とか、サイト内自動検索機能の構築などがあげられます。それらの動作概要を図 1-1-4に示します。

1)データベースとの連携 たとえば、Microsoft AccessやSQLサーバーなどのデータベースとの連携によ り、データベース情報をブラウザ上に表示させたり、あるいは逆にデータベースに ブラウザ上から情報を加えたりと、ブラウザからのデータベース操作が可能です。

16


1章 まず、知っておくこと

2)メール送受信 メールサーバーの指定さえしてあげれば、メーラーを使わずに、メールの送受信 をブラウザ上で実現できます。

3)ファイルとの対話 ファイルサーバーにアクセスし、ファイルのアップロードなどのファイル操作を 行うことができます。

大まかな処理フロー ColdFusionの基盤にあるWebサーバーはクライアントからのHTTPリクエスト に含まれるCFMLをColdFusionサーバーに渡してやります。そして、ColdFusion サーバーがそれを処理し、結果をWebサーバーに返してやります。更に、その結 果をWebサーバーがクライアントに返すわけです(図1-1-4)。 ■図1-1-4 ColdFusionの動作の概要 データベース データの読み取り データの追加など

ColdFusion Server Webサーバー

HTML

メールの送受信

ファイルとの対話

メールサーバー

ファイル

HTTPリクエスト

17


ColdFusionの関連製品紹介 以下にColdFuisonの関連製品を紹介いたしましょう。本書では、ColdFusion Server Enterprise Edition を利用します。

ColdFusion Server Enterprise Edition / Professional Edition 「キング・オブ・Webアプリケーション」といっても 過言ではないであろうWebアプリケーションサーバ ー。Enterprise Editionは大中規模サイト向けであり、 Professional Editionは比較的小規模サイト向け

Dreamweaver Webサイト構築支援ツール。ビジュアルな開発 環境が準備されており、これを使えば、全ての HTMLタグを暗記していなくても、楽にページ 作成が可能

18


1章 まず、知っておくこと

Flash 5 アニメーションWebサイトの作成には、欠かせ ない一品!グラフィカルな部分は、Flash 5 に お任せ!

ColdFusion 5 UltraDeveloper 4 Studio コード編集機能やデバッグ機能を備えたColdFusion Studio 5 と、Dreamweaver UltraDeveloper 4 のビジ ュアルな開発環境を統合した、Webサイト構築支援 ツール

Home Site 5 HTMLをはじめ、XHTML,CFMLなど様々な言語のタ グ構文を検証することなどが可能な、コード作成の 支援ツール

19


1-2 ColdFusionの魅力〈特徴〉 ColdFusionの特徴 では、以下にColdFusionの特徴をまとめてみます。

1)タグの数 70以上/関数の数 約200 このくらいの数があれば、Webサイトを構築する上で、ある程度のことは一通 りできると思います。本書では、第2章、第3章を中心に最も基本と思われるタグ に焦点を当て紹介します。もし、ColdFusionが基本で持たない機能を実現したい 場合は、皆さんが独自に定義できる「カスタムタグ」と呼ばれるタグを作ることも 可能です。また、関数については、タグの説明の中で登場するものを中心に紹介 します。

2)他言語との共存 JavaScript、HTMLなどとの共存が可能です。 HTMLとの相違点 a)既定の拡張子はcfmである b)ColdFusionアプリケーション内では、CFMLが使われる c)ブラウザのソース表示では表示されない

3)CGIなどと比較するとレスポンスが速い ColdFusionの場合、Webサーバーとのやりとりが、CGIに比べて速いというこ とになります。つまり、アクセス要求がある度にScriptを起動するCGIとは違い、 ColdFusionの場合はAPI経由でWebサーバーと通信し、マルチスレッドと呼ばれ る方式で高速に処理要求をこなします。

4)Flashなど、マクロメディア社の他の製品との連携 CFMLを利用していればJavaアプレットやDHTMLなどを使わずに、ダイナミッ クなWebページを作成することも可能です。 これはアニメーションツールとして名 高いマクロメディア社のFlash 5を使い、これとCFMLを連携させることにより実 現可能となります。 具体的にはFlashファイルの中で動的に変化する文字部分をデータベースから呼 び出し、アニメーション化することで実現する手法などがあげられます。

20


1章 まず、知っておくこと

■図1-2-1 Flashと連携したページ

このサンプルは下記のマクロメディア社のホームページ上にもあり、サンプルを ダウンロードできるようになっていますので、自分の目で確かめてみてください。と ても便利なのがわかると思います。またこの章の最後にあるコラムでも、その一例 を紹介します。 http://www.macromedia.com/software/coldfusion/ resources/flash_coldfusion/

21


1-3 ColdFusionの生い立ち〈歴史と背景〉 デビューからの歴史 現在マクロメディア社にて発表されているColdFusionですが、元々は1990年代 半ばに米国のAllaire社で発表されたWebアプリケーションツールなのです。その後 見事に、米国ではシェアNo.1のアプリケーションサーバーにまで成長し、数々の 賞を受賞、そして米国内のシステムエンジニア、Webクリエーターなど、誰もが 知るWebアプリケーションツールとなったようです。

今なぜColdFusion? では今なぜColdFusionなのか? ということについて考えてみましょう。Webア プリケーションと聞いて読者の皆さんが最初に思い浮かべるのは何でしょう? Web アプリケーションについてまったく知らない人、名前だけなら知っているという人、 様々だとは思いますが、名前を知っているあなたが思い浮かべるのは何ですか? ASPですか? PHPですか? ColdFusionですか? それぞれに個性があるはずなの で、ColdFusionだけが、ジャンプ競技でいうK点超えをしているのでお薦めした い!というわけではありません。日本では、今日までずーっと日陰に隠れていて、 「みーつけた!」という人以外にはその存在すら知られていないという現実があり ました。それで、まず「今日」の時点でせめて知名度については他のWebアプリ ケーションツールと同じ程度まで上がって欲しいと思ったのが正直なところです。 また、本来これらを比較することはナンセンスなのかも知れません。しかし、Web アプリケーションとよばれるものがあまりにたくさんあると、それを選択する際に、 どれを選択すればいいのかわからなくなってしまうというケースも多々あるでしょ う。よって、世間一般、相対比較が好き!という傾向があるので、24ページで比

22


1章 まず、知っておくこと

較によるColdFusionの優位性について触れます。ただ心の片隅に常に置いておい てもらいたいのは、単に比較をするよりも、目的をはっきりさせ、その目的により 適するものを開発ツールとして選択するということが、大事なことだということで す。

ColdFusionと著者の関係 そんな偉そうなことをいう著者ですが、なぜColdFusionを選択したのかについ ては語れません。なぜなら著者の場合、米国で生活をし、インターンとしてCM制 作会社でWeb製作のお手伝いをすることになったときに初めて、この画期的なア プリケーションに出会うことになったわけですから、既に環境は用意されていまし た。つまり許嫁のように著者のWebアプリケーションの相手は最初からColdFusion だと決まっていたのです。しかしそのときは、これは久々におもしろいものに巡り あった! と思いました。とにかく、著者のように初めて使う場合でもすぐ飲み込 めて、短期間で理想のものができあがる! というのがこのColdFusionをこれから 日本で普及させたいと思うようになった大きな理由でしょう。先に述べたように、 Flashとの連携も可能ですし、Web クリエーターや個人のホームページクリエータ ーの皆さんにも、きっと役に立つ道具になると思っています。

23


他のツールとの比較 ちょっと話が逸れましたので、軌道修正をしましょう。先に、比較はあまりよ くないかもしれないといいつつ、本書はColdFusionに関する本ですので、その優 位性などについて述べたいと思います。 まず、あなたの利用しているOSとWebサーバーはなんでしょう?ASPは基本的 にWebサーバーとしてIISしかサポートしておりませんので、UNIXユーザーはつら いですよね。そして、短期で開発をしなければいけないという立場にたたされてい る方なら他のWebアプリケーションサーバーよりColdFusionが向いているかもし れません。なぜなら、データベースとのコネクションを要するコードを2つ並べて書 いてみれば一目瞭然だと思いますが、たとえばASPはColdFusionに比較するに、 それの約2∼4倍ほどの長さのコードを要するのではないでしょうか?更に、Script 言語がどうも好きになれない!ややこしい!と感じておられる方ならば、タグベー ス言語を利用するColdFusionに心は傾くのではないでしょうか?早く言ってしま えば、簡単に、より多くの人に、なつかれる可能性を秘めているのがColdFusion なのではないかと思います。すでに米国では王者の地位についているわけですので、 日本国内でもこの時代の先端を行くツールとして活躍させてやってもいい頃なので はないかと思っています。 それでは、次章から実際のタグの紹介を始めることにしましょう。

24


1章 まず、知っておくこと

25


C

O

L

U

M

Flash 5との連携で実現させる動的なWebページ

上のページは、天気予報を表示させる枠組みや、 「晴れ」、「曇り」、「雨」のアニメーションを Flash5で作成し、気温などの情報はデータベース テーブルから引いてきて動的に表示させるという 仕組みになっています。これは、次章からの基本 的なタグなどを習得してから、お試しで遊んでみ ると楽しいと思います。

26

N


CFMLのテイスティング CFMLの基本 本章では、ColdFusionでよく利用するCFMLの4 つのタグについて紹介します。ここはさわりの部 分なので、まだおもしろみは伝わらないかもしれ ませんが、CFMLのタグを利用する上でのキーポ イントなど交えて説明します。

2


2-1 データの出力〈CFOUTPUT〉 現在の日付を表示する 始めに現在の日付を表示する簡単なページを作ってみましょう。ここでは 「CFOUTPUT」というタグを利用します。 ■date.cfm <html> <head> <title>日付</title> </head> <body> <h1> <cfoutput> 今日は#DateFormat(now(),"YYYY 年 M 月 D 日")#です。 </cfoutput> </h1> </body> </html>

構文 <cfoutput>#関数など#</cfoutput>

日付を表示するプログラムは非常にシンプル。DateFormat関数(30ペー ジ 関数2参照)を追加すればいいだけです。DateFormat関数の詳細について はあとで紹介しますので、ここでは日付を表示するためのものだと考えてく ださい。ここでは「CFOUTPUT」の使い方を見てください。「#」で関数を 囲むだけで、その関数の実行結果がページに表示されるのです。

28


2章 CFMLのテイスティング

■図2-1-1 date.cfmの表示結果

ポンド記号(#)を忘れずに ColdFusionでは、「CFOUTPUT」タグ内におかれた変数または関数がポン ド記号(#)によって囲まれていると、その値を出力します。

CFOUTPUTの属性 CFOUTPUT query

クエリ結果の出力

startrow

出力の最初の行

maxrows

何行出力するか

主に利用される属性に以上のようなものがあります。今回の「CFOUTPUT」で は属性を利用していませんが、第3章以降でよく利用するので覚えておきましょう。

29


関数1 Now 関数とは数行にわたる長い数式などで、同じものを何回も使う場合、そのたび に数式を入力しなくてもデータの値を変えるだけでいいようにするもので、たとえ ばf(x,y)(x、yはデータ)のように関数名(この例では「f」 )を付けて定義してお くものです。こうすることによって、同じ数式を使うときには簡単に再利用できる ようになります。 Now関数は、ColdFusionサーバーが持っている現在の日時を出力させる関数 です。今回はDateFormat関数の中で利用されましたが、単体で、 <cfoutput>#Now()#</cfoutput> と書けば、結果は(2002年3月13日 22時8分53秒の場合) {ts '2002-03-013 22:08:53'} という形で示されます。この形は、あまり見やすい出力形式ではないかもしれませ んので、この関数を他の日付関数(たとえば、DataFormat関数)にパラメータ ーとして渡して使えば、馴染んだ形式(例:2002年3月13日)で現在時刻を表 示させることが可能です。

関数2 DateFormat DateFormat関数を使った日付の表示について紹介しましたが、その表示方法 は多岐に渡ります。ここでは、そのマスク(表示形式を指定するもの)の種類に ついて紹介しましょう。 DateFormat(Date, [,mask]) date.cfmで「DateFormat(Now(),"YYYY 年 M 月 D 日")」と書いたのを覚えて いるでしょうか。具体的に、表2-1-1で「mask」のバリエーションについて紹介 します。これらのY/M/D(年/月/日)を自由自在に組み合わせて使うことができま すので、いろいろと試してみてください。

30


2章 CFMLのテイスティング

■表2-1-1 2001年7月9日のバリエーションの例

Mask

表示

YYYY 年 MM 月 DD 日

2001 年 07 月 09 日

YYYY 年 MM 月 DD 日 (DDD)

2001 年 07 月 09 日 (月)

YYYY 年 M 月 D 日

2001 年 7 月 9 日

YYYY 年 M 月 D 日 (DDD)

2001 年 7 月 9 日 (月)

YYYY 年 M 月 D 日 DDDD

2001 年 7 月 9 日 月曜日

YYYY 年 MMMM D 日

2001 年 7 月 9 日

YY / MM / D

01 / 07 / 9

YY / MM / DD

01 / 07 / 09

YY / MM / DD (DDD)

01 / 07 / 09 (月)

関数3 TimeFormat 日付が表示できたら、今度は時刻は表示できないの? と思ってしまったでしょ うか。もちろん、できます。時刻の表示にはTimeFormat関数を使いますが、要 領はDateFormat関数での日付表示と同じです。 TimeFormat(Date, [,mask])

■表2-1-2 午後2時06分01秒のバリエーションの例

Mask

表示

tt h 時 m 分 s 秒

午後 2 時 6 分 1 秒

tt h 時 m 分 ss 秒

午後 2 時 6 分 01 秒

hh 時 mm 分 ss 秒

02 時 06 分 01 秒

tt hh 時 mm 分 ss 秒

午後 02 時 06 分 01 秒

H時m分s秒

14 時 6 分 1 秒

H 時 mm 分 ss 秒

14 時 06 分 01 秒

HH 時 m 分 s 秒

14 時 6 分 1 秒

31


2-2 テンプレートの呼び出し〈CFINCLUDE〉 ヘッダー部、フッター部の独立化 「CFINCLUDE」というタグを使って、あるページの中で独立したヘッダー部 (CFMテンプレート)とフッター部(CFMテンプレート)を呼び出す方法を紹介 しましょう。この方法を使ってヘッダー部とフッター部を別のファイルにしておく と、複数のWebページの作成を効率的に行うことができます。 処理フロー ここでは、main.cfm、header.cfm、footer.cfmという3つのファイルを作成 します。そしてmain.cfmの中にheader.cfmとfooter.cfmを組み込みます。

■図2-2-1 処理フロー <CFINCLUDE>

header.cfm

main.cfm <CFINCLUDE>

■図2-2-2 main.htmlの表示結果

32

footer.cfm


2章 CFMLのテイスティング

たとえば図2-2-2のようなページは以下のようにHTMLで記述することがで きます。

■main.html <html> <head> <title>ようこそColdFusionの世界へ</title> </head> <body bgcolor="Aqua">

q

<h1>ようこそColdFusionの世界へ!!</h1> <hr> <h1>ようこそColdFusionの世界へ!</h1><br> <h2>ようこそColdFusionの世界へ!</h2><br> <h3>ようこそColdFusionの世界へ!</h3><br> <hr> <a href="mailto:webmaster@XXXXX.XX.jp">メールはこちらへ</a> </body> </html>

w

e

このHTMLのqの部分をヘッダー、eの部分をフッターとして、3つのパ ーツに分割してしまうのです。qの部分を「header.cfm」、eの部分を 「footer.cfm」、このページ全体を「main.cfm」とします。まずはheader.cfm とfooter.cfmを見てみましょう。

33


■header.cfm <html> <head> <title>ようこそColdFusionの世界へ</title> </head> <body bgcolor="Teal"> <h1>ようこそColdFusionの世界へ!!</h1> <hr>

■footer.cfm <hr> <a href="mailto:webmaster@XXXXX.XX.jp">メールはこちらへ</a> </body> </html>

main.cfmでは「CFINCLUDE」というタグを利用してこれら2つのCFMテンプ レートを呼び出します。先ほどのHTMLで作成したものと同じページを作成するこ とができるのです。 ■main.cfm <cfinclude template="header.cfm"> <h1>ようこそColdFusionの世界へ!</h1><br> <h2>ようこそColdFusionの世界へ!</h2><br> <h3>ようこそColdFusionの世界へ!</h3><br> <cfinclude template="footer.cfm">

構文 <cfinclude template="ファイル名">

34


2章 CFMLのテイスティング

■図2-2-3 main.cfmの表示結果

CFINCLUDEは、複数のWebページの作成で同じソースコードを書かなくては いけない場合などに、とても有効に利用できるタグです。ヘッダー・フッター領域 を固定した何ページにも及ぶホームページ作成の場合などにとても活躍します。 たとえばmain.cfmに関連するページが何ページもあるというとき、背景の色を 変えたいと思ったときは、header.cfmの<body bgcolor="Aqua">の色指定を変更 すれば、一気にすべてのページの背景色を変えることができます。 また、header.cfmの中にHTML開始タグ、footer.cfmの中にHTML終了タグを それぞれ含んでいますので、main.cfmには<html>や</html>という記述は不要に なります。そのため、こんなにシンプルなソースコードに見えるわけです。

CFINCLUDEの属性 template

呼び出すCFMファイル名を指定(必須属性)

35


2-3 フォームを利用する〈CFFORM〉 フォームの利用 HTMLの「FORM」タグと同様に、ColdFusionにも「CFFORM」というフォ ームを利用するためのタグがあります。ただし、ここでは深く触れずに参考程度に 紹介します。なぜなら、フォームを作成する際にはHTMLのFORMタグをそのまま 利用することが可能であることと、後ほど紹介する「CFTREE」タグのような CFFORMの中で利用されるタグと一緒に利用することで有効に活用できるタグで あるという理由からです。ここでは参考程度にプロフィールを入力するWebページ をCFFORMを利用して作成し、その結果を出力する方法について紹介します。 CFFORMを使うとどのようになるのかを知っておきましょう。また、最後に 「CFTREE」というCFFORMタグの中で使われるタグについての実行例を紹介し ます。 処理フロー ここでは、inputprofile.cfm、profile.cfmという2つのファイルを作成します。 inputprofile.cfmでフォームを利用して必要事項を入力し、その後の処理を profile.cfmに引き継ぐという形になります。

■図2-3-1 処理フロー

inputprofile.cfm

[送信]をクリック

profile.cfm

ポイントは、処理をprofile.cfmに引き継ぐところです。ColdFusionを利用しな い場合は、たとえばアンケートフォームなどからCGI等に処理を引き継ぎますが、 今度は同じCFMテンプレートで処理することになります。 それでは、図2-3-2のような入力項目を持つinputprofile.cfmを作成してみまし ょう。図2-3-2はHTMLで書いたものとほぼ同じ入力フォームです。

36


2章 CFMLのテイスティング

■図2-3-2 inputprofile.cfmの表示結果

■inputprofile.cfm <html> <head> <title>プロフィ−ル入力</title> </head> <body> <h1>プロフィール</h1> <cfform action="profile.cfm" Method="POST">

q

<b>姓:</b> <cfinput type="text" name="lname"> <br> <b>名:</b> <cfinput type="text" name="fname"> <br>

37


<b>住所:</b> <cfinput type="text" name="address" size="40"> <br> <b>年齢:</b> <cfinput type="text" name="age" size="5"> <br> <b>性別:</b> <cfinput type="Radio" name="sex" value="男性">男性 <cfinput type="Radio" name="sex" value="女性">女性<br> <br> <b>あなたの大好きな映画についてコメントしてください。</b><br> <textarea name="fmovie" Rows="6" cols="30"></textarea> <br><br> <input type="submit" value="送信"> <input type="Reset" vakue="リセット"> </cfform> </body> </html>

構文 <cfform action = "ファイル名" method="動作名" ……> ………… </cfform>

では、実際のファイルの中身(ソースコード)について解説しましょう。 inputprofile.cfmのqでprofile.cfmというファイルに入力した情報を引き渡します。 これがC o l d F u s i o n で処理する場合の特徴といえるでしょう。この例では、 「CFINPUT」タグ(HTMLのFORMでいうINPUTとほぼ同じと考えてください) のtype属性をRadio、textの2種類利用しました。Radioは性別の選択に、textは 姓名と住所、年齢、好きな映画のコメントの入力に使っていますね。

38


2章 CFMLのテイスティング

HTMLのみで書いた場合との類似性について確認したければ、CFFORMを FORMに、CFINPUTをINPUTに変えて実行してみてもいいでしょう。ほぼ同じ表 示になることが確認できるはずです。 では、実際の処理を行うprofile.cfmについて紹介しましょう。 ■profile.cfm <html> <head> <title>プロフィール</title> </head> <body> <h1>ようこそ映画サークルへ</h1> <h2>プロフィール</h2> <p><cfoutput><b>名前:</b> #lname#

#fname#</cfoutput></p>

<p><cfoutput><b>住所:</b> #address#</cfoutput></p> <p><cfoutput><b>年齢:</b> #age#</cfoutput></p> <p><cfoutput><b>性別:</b> #sex#</cfoutput></p> <b>大好きな映画についてのコメント:</b><br> <cfoutput>#fmovie#</cfoutput> </body> </html>

CFMLのコメント文 ColdFusionでコメント文を書くときは、

<!--- ここからコメント ---> の形で書いてください。決まり事です。

39


■図2-3-3 inputprofile.cfmにデータを入力する

■図2-3-4 [送信]をクリックし、profile.cfmが表示された画面

図2-3-3のようにフォームに値を入力し、 [送信]をクリックすると図2-3-4のよ うに表示されます。

40


2章 CFMLのテイスティング

profile.cfmで具体的にどうやって入力した値を出力させるのかを説明すると、 28ページで学習したCFOUTPUTタグを使い、出力させる変数を「#」記号では さむ形で書いています。たとえば、<cfoutput>#address#</cfoutput>のように書 いていますね。これは、inputprofile.cfmの中の<cfinput>で住所を入力させる項目 の名前を「name="address"」と定義し、ここで入力された値はaddressという 変数に設定されているため、これを「#」で囲んでいるわけです。その他も同様に、 フォームで渡された変数を「#」で囲んでいますね。

フォームの応用 フォームの応用として、もう一例、CFFORM内で用いられる「CFTREE」と いうタグについて例を示します。CFTREEタグを使えば、図2-3-5のように(まる でWindowsのエクスプローラのように)ファイルをツリー状に表示することができ ます。これは応用なので、「こういうことも実現可能なのだ」という程度で心に留 めておいてください。 ■図2-3-5 cftree.cfmの表示結果

41


■cftree.cfm <cfform action="test.cfm" method="POST" name="test"> <cftree name="movie_tree" highlighthref="yes" height="400" width="200" HSCROLL="no" VSCROLL="yes"> <cftreeitem value="Movies" expand="Yes"> <cftreeitem value="オードリー・ヘップバーン" parent="Movies" expand="No"> <cftreeitem value="ローマの休日" parent="オードリー・ヘップバーン" img="document" href="roman.html"> <cftreeitem value="ティファニーで朝食を" parent="オードリー・ヘップバーン" img="document"> <cftreeitem value="マイフェアレディー" parent="オードリー・ヘップバーン" img="document"> <cftreeitem value="レオナルド・ディカプリオ" parent="Movies" expand="No"> <cftreeitem value="タイタニック" parent="レオナルド・ディカプリオ" img="CD"> <cftreeitem value="太陽と月に背いて" parent="レオナルド・ディカプリオ" img="Folder"> <cftreeitem value="メグ・ライアン" parent="Movies" expand="No" img="floppy"> <cftreeitem value="トム・ハンクス" parent="Movies" expand="No"> </cftree> </cfform>

42


2章 CFMLのテイスティング

その他、CFFORM の中で利用するタグとして CFTREEITEM

ツリーのブランチ作成(cftree.cfm参照)

CFSELECT

ドロップダウンリスト

CFGRID

グリッドコントロールの設定

CFTEXTINPUT

1行のテキスト入力ボックス

CFAPPLET

カスタムJava Appletの参照

などがあります。

Java Appletの取り込み cftree.cfmを実行すると、Java Appletの取り込みのために、「J2RE をイン ストールして実行しますか?」などのインストールに関するセキュリティ のメッセージが出ます(Webブラウザによってメッセージは異なります)。 この場合、「はい」をクリックして(これもWebブラウザによってメッセー ジは異なります)、実行してください。

43


2-4 条件分岐〈CFIF/CFELSEIF/CFELSE〉 条件によって処理を分岐させる 次に条件文で使う「CFIF」を紹介します。どんなプログラミング言語でもIFを 使った条件文は必ず出てくるものなので、これを覚えておかないと先に進めないで しょう。使い方はいたって平凡、特別なことは何もありません。もしも、条件文 など見たこともないという人は、このセクションの最後にIF文について解説します ので、そちらを参考にしてみてくださいね。

利用心得 ● CFIFはその条件の終わりで必ず</cfif>を利用し、条件文を閉 じる ● CFELSEIFやCFELSEは必ず<cfif>∼</cfif>の中で使われる ● ひとつの<cfif>∼</cfif>の中で利用するCFELSEIFについて の個数制限はない ● ひとつの<cfif>∼</cfif>の中で利用できるCFELSEは一個の みで、最後の条件(残りの条件)に使われる ● CFIFは、表2-4-1、表2-4-2に示すような条件式を利用する ■表2-4-1 条件表記

条件表記

略表記 意味

利用例

IS

EQ

等価

<cfif A EQ B>

IS NOT

NEQ

不等価

<cfif A NEQ B>

LESS THAN

LT

不等号(<)

<cfif A LT B>

LESS THAN OR EQUAL

LTE

不等号(≦)

<cfif A LTE B>

GREATER THAN

GT

不等号(>)

<cfif A GT B>

GREATER THAN

GTE

不等号(≧)

<cfif A GTE B>

■表2-4-2 複数の条件を合わせる表現

44

表記

意味

利用例

AND

なおかつ

<cfif (A EQ 0) AND (B EQ 0)>


2章 CFMLのテイスティング

表2-4-1にある略表記でなくとも、たとえばNEQであれば、 <cfif A IS NOT B> のように書くこともできます。しかし、スペースの問題やタイピングの手間を省く ためにはこれらの略表記を使うことをお薦めします。

3択のクイズに答える では、CFIF、CFELSEIF、CFELSEという条件分岐のタグを使ってクイズを 作るページを紹介します。

処理フロー ここでは、question.cfm、answer.cfmという2つのファイルを作成します。具 体的には2001年のオスカーを題材に質問を用意し(question.cfm)、回答は answer.cfmで条件文を使って正解か不正解かを表示します。 ■図2-4-1 処理フロー

question.cfm

[回答する]をクリック

answer.cfm

45


■図2-4-2 question.cfmの表示結果

図2-4-2では、2001年のオスカー作品賞を受賞したのはどれか? という質問を 用意しています。question.cfmはラジオボタンで回答を選択させるフォームです。 この選択結果をanswer.cfmに渡し、条件文を使って正否を返すわけです。

■question.cfm <html> <head> <title>問題</title> </head> <body> <h1>問題</h1><br> <h3>2001年アカデミー賞</h3><br> <h4>1.) 作品賞に輝いたのは?</h4> <form action="answer.cfm" method="POST"> <p>

46


2章 CFMLのテイスティング

<h4>■□■□■□■□■□■□■□■□</h4> <h4>下の選択肢から選んでください。</h4> <input type="radio" name="oscar" value="grad"> <b>グラディエーター</b><br> <input type="radio" name="oscar" value="tiger"> <b>グリーンディスティニー</b><br> <input type="radio" name="oscar" value="brocko"> <b>エリン ブロコビッチ</b><br> <br> <p> <input type="submit" value="回答する"> <input type="reset" value="リセット"> </form> </body> </html>

■answer.cfm <html> <head> <title>回答</title> </head> <body> <cfif form.oscar EQ "grad"> <h3>正解!! グラディエーターがオスカーを受賞しました。</h3> <cfelseif form.oscar EQ "tiger"> <h3>残念、不正解です。</h3> <cfelse> <h3>残念、不正解です。<br> (参考)エリン ブロコビッチでジュリア・ロバーツは<br> 主演女優賞を受賞しました。</h3> </cfif>

q w e

</body> </html>

47


構文 <cfif 条件式> <cfelseif 条件式> ○○○○○○○○○○○○ <cfelse> ○○○○○○○○○○○○ </cfif>

CFIFの条件文で、「form.oscar EQ "grad"」と指定しています。選んだラジオ ボタンの名前がgradならば(つまりグラディエーターを選択したならば)qの文章 が表示されます。また選んだラジオボタンの名前がtigerならば(つまり、グリーン ディスティニーを選択したならば)w、それ以外の場合はeの文が表示されるよ うに設定しているのです。CFIFタグの中で、form.oscarという形の変数を使って いますが、これは、question.cfmで「name="oscar"」と定義したフォームの変数 (ラジオボタンの値)を示しています。

■図2-4-3 「グラディエーター」と回答した場合

48


2章 CFMLのテイスティング

図2-4-3は正解であるグラディエーターを選択した場合の結果です。answer.cfm のqを返していることがわかるでしょう。

■図2-4-4 「グリーンディスティニー」と回答した場合

図2-4-4はグリーンディスティニーを選択したときの結果です。answer.cfmのw を返していることがわかります。このように、条件文に従って正しく結果が分かれ るクイズを作ることができました。

49


IF文の考え方 IFというのは条件分岐命令と呼ばれており、「条件に一致すれば、次の処理を 行いなさい」というものです。 if ( 条件式 ) 実行命令 構文は上記のような形になっており、「条件式」に一致した場合のみ「実行命 令」の部分が実行されます。具体的に例をあげると以下のようになります。たと えば、「今日が金曜日なら映画を観に行く」という文は、 if (「今日の曜日」 == 「金曜日」) 映画を観に行く となります。条件に一致しなかった場合は、「実行命令」の部分を飛ばして次の 処理が始まることになります。 上記のIF文は、CFMLでは <cfif 「今日の曜日」 EQ 「金曜日」> 映画を観に行く </cfif> となります。 では条件に一致しない場合で追加の条件がある場合はどうするのでしょうか? たとえば「今日が金曜日でなく、日曜日だったら終日寝ている」という場合はど うしましょう。この場合は、ELSE IF文を使います。ELSE IF文を使うと「今日 が日曜日なら終日寝ている」とか、さらに「今日が月曜日ならスポーツクラブに 行く」などの文を付け加えることができます。以下のような形になります。 IF (「今日の曜日」 == 「金曜日」) 映画を観に行く ELSE IF (「今日の曜日」 == 「日曜日」) 終日寝ている ELSE IF (「今日の曜日」 == 「月曜日」) スポーツクラブに行く

50


2章 CFMLのテイスティング

となります。 ColdFusionのCFMLで書く場合は、 <cfif 「今日の曜日」 EQ 「金曜日」> 映画を観に行く <cfelse if 「今日の曜日」 EQ 「月曜日」> スポーツクラブに行く <cfelse if 「今日の曜日」 EQ 「日曜日」> 終日寝ている </cfif> という感じですね。 それから単に、金曜日以外という条件にしたいのであれば、ELSEを利用しま す。「今日が金曜日なら映画を観に行き、金曜日以外は毎日六本木に遊びに行く」 というのであれば、 IF (「今日の曜日」 == 「金曜日」) 映画を観に行く ELSE 六本木に遊びに行く となります。うらやましいですね。 念のためCFMLの場合も以下に記します。 <cfif 「今日の曜日」 EQ 「金曜日」> 映画を観に行く <cfelse> 六本木に遊びに行く </cfif> となります。

51


C

O

L

U

M

N

新タグCFFLUSH

まだまだ基 本 タグの紹 介 は続 きますが、

52

ば、順を追って表示させることが可能です。以下

ColdFusion Server 5で組み込まれた新しいタグ

に「独り言」をつぶやいている状態を紹介します。

で、 「CFFLUSH」というタグがありますので、こ

本格的にColdFusion開発に携わるようになれ

れを利用した例を以下に示します。これまでは、

ば有効なタグだと思いますので、こういったこと

漸次的に出力結果を表示するためのタグは、存在

もできるということを記憶の片隅に置いておいて

しなかったようなのですが、このタグを利用すれ

もらえればと思います。


データベースをスパイスに データベースとの連携 本章では、いよいよColdFusionとデータベースを 連携させて、映画のデータベースを題材に遊んで みます。データベースへのデータ追加や更新、削 除など色々な動作の説明があり、スパイスが効い ていい味になってくると思います。

3


3-1 データベースを利用するための準備〈データソースの登録〉 データベースを利用するにはデータソースが必要 ColdFusionを利用するからには、Microsoft AccessやMicrosoft SQL Serverと いったデータベースと連携をはかる機会が非常に多いことでしょう。そのためには、 当 たり前 ですが、 まずはそのデータベースを作 成 しなくてはいけません。 ColdFusionのプログラムからデータベースを利用するには、このデータベースにつ いてのデータソースを作成しなくてはなりません。これがないと、いくら正確なプ ログラムを作ってもデータベースとの連携がはかれないということを最低限覚えて おいてください。

ODBCってなに? ODBCとはOpen DataBase Connectivityの略でMicrosoft社が提唱したデータ ベース接続方式です。Microsoft AccessやMicrosoft SQL Serverといったデー タベースの違いは、このODBCドライバが吸収してくれます。また、OLE-DBと はこれまたMicrosoft社が提唱する汎用データ・アクセス・インターフェイス仕 様で、ODBCを汎用化させたものと考えればよいでしょう。

54


3章 データベースをスパイスに

ColdFusion管理者ページでデータソース名を登録する では、実際どのようにデータソースを作成するのか見てみましょう。非常に簡単 です。ここではODBCを例にとり、ODBCデータソースを作成する方法を説明し ますが、その他のSybase、Oracleデータベースなどについての設定も可能です。 本書ではMicrosoft Accessのデータベースを使った例で解説していきます。 まずWebブラウザを起動して、ColdFusion管理者ページを表示させます(図31-1参照)。URLは http://127.0.0.1/CFIDE/administrator/index.cfm です。ここで、ColdFusionをインストールした際に決めたパスワードを入力し、ロ

■図3-1-1 ColdFusion管理者ページ

55


グインします。そして、ページの左側に表示される設定項目リストから[データソ ース]という項目の中にある[ODBCデータソース]を選択してください。そうす ると、図3-1-2のような画面になります。

■図3-1-2 ODBCデータソースの登録

ここでデータソース名を入力するわけですが、本書で利用するデータソース名を 「sample」としましょう。[接続されているデータソース]の下のテキストボック スに「sample」と入力し、[Microsoft Access Driver(*.mdb)]が選ばれてい るのを確認してから[追加]ボタンをクリックすると図3-1-3の画面になります。 ここでは「C:¥CFusion¥cftest¥sample.mdb」にデータベースファイルがあると します。必要事項を入力し、[作成]ボタンをクリックすると設定は完了です。も う一度ODBCデータソースの画面に戻ると、図3-1-4のように[sample]という データソースが作成されていることが確認できます。

56


3章 データベースをスパイスに

■図3-1-3 データベースファイルのパスを入力する

■図3-1-4 「sample」データソースが登録された画面

57


3-2 データベースとの連携〈CFQUERY〉 データベースの準備 さて、それではColdFusionのデータベースとの連携について見ていきましょう。 まず初めに、「sample.mdb」という名前のデータベースファイルに「movie」と いうテーブルを作成します。movieテーブルのフィールドとデータについては、表 3-2-1と図3-2-1を参照してください。「title」は映画のタイトル、「year」はその 映画が公開された年、 「actor」は主な出演俳優もしくは女優、「country」はそれ がどこの国の映画なのかなど必要な情報を準備し、入力します。

■表3-2-1 movieテーブルのフィールド

フィールド名 movieID

オートナンバー型、インデックス重複なし

year

数値型

title

テキスト型、主キー

actor

テキスト型

■図3-2-1 movieテーブルのデータ

58

データ型とプロパティ


3章 データベースをスパイスに

データの呼び出し movieテーブルから「year」と「title」フィールドのすべてのデータを呼び出し、 Webブラウザで表示させる方法を見てみましょう。データベースと連携するには 「CFQUERY」というタグを使います。CFQUERYを使ってデータを呼び出すプロ グラムをmovie_display.cfmとし、以下に示します。

処理フロー ここでは、そのmovie_display.cfmでデータソースsample、テーブル名movie との連携をはかります。

■図3-2-2 処理フロー sampleデータベース

movie_display.cfm

データの読み込み movieテーブル

■movie_display.cfm <cfquery datasource="sample" name="get_movie"> SELECT year,title From movie </cfquery>

q

<html> <head> <title>映画のリスト</title> </head> <body> <h1>映画のリスト</h1> <table border="3"> <tr>

59


<td><b>年</b></td> <td><b>タイトル</b></td> </tr> <cfoutput query="get_movie"> <tr> <td>#year#</td> <td>#title#</td> </tr>

w

</cfoutput> </table> </body> </html>

構文 <cfquery datasource="データソース名" name="クエリ名" ……………… > SQLステートメント </cfquery>

qのCFQUERYについて ColdFusionとデータベースの連携にはこの「CFQUERY」というタグを使いま す。このタグは、HTMLの開始タグよりも上に記述します。今回は、「movie」と いうテーブルからフィールド「year」と「title」のデータを引き出すのでしたね。 SELECT year,title From movie というSQLステートメントがCFQUERYの中に書かれています。これは「titleと yearフィールドをmovieテーブルから読み出す」という意味です。SQLステートメ ントがわからないという人には、これはいきなり辛いかもしれません。この章の最 後(140ページ)にある「コラム SQLの基礎知識」を参照してください。

60


3章 データベースをスパイスに

「CFQUERY」は、 「datasource」属性で指定されたデータソースに対しSQL ステートメントを送ります。後ほど具体的な例を示しますが、この場合のSQLス テートメントはSELECT、INSERT、UPDATE、DELETEなどです。ここでは情 報を引き出すので、SELECT文を利用しています。

wのCFOUTPUTについて 「CFOUTPUT」タグを使って、qで「get_movie」と定義したクエリ (name=get_movie)から結果を出力します。SELECT文で呼び出したフィール ド名 を「 # 」 で囲 むだけで、 そのフィールドのデータが表 示 されます。 movie_display.cfmの実行結果が図3-2-3です。 ■図3-2-3 movie_display.cfmの表示結果

図3-2-1のyearとtitleのデータがすべて抽出されていることが確認できたでしょ う。これがシンプルなデータベース情報の表示です。

61


CFQUERYの属性 CFQUERY datasource

データソース名(必須属性)

name

クエリに付ける任意の名前(必須属性)

「datasource」は、文字通りデータソースを指定します。ここには本章の3-1 で作成したデータソースを指定します。 「name」はこの「CFQUERY」タグについての名前を任意に定義します。こ こでは映画情報の年代とタイトルを引き出すということですので、get_movieとい う名前を付けました。「CFQUERY」は、クエリの結果をここで付けられた名前の 中に格納します。ですから、クエリの結果を出力させたい場合は「CFOUTPUT」 のquery属性(28ページ 第2章 2-1参照)を使ってこの名前を指定する必要があ るのです(movie_display.cfm参照)。 その他のオプション属性は、以下の表の通りです。

■表3-2-2 CFQUERYのオプション属性

Blockfactor

Cachedafter

Cachedwithin

Dbpool

Dbserver

Dbtype

Debug

Password

Provider

Providerdsn

Timeout

username

データを絞り込んで呼び出す 今度は条件を付けてデータを呼び出してみましょう。試しにアメリカ映画のみを 出力させます。このプログラムをmovie_select.cfmとします。movie_display.cfm とmovie_select.cfmの相違点は、4行目のWHEREの部分のみです。

62


3章 データベースをスパイスに

処理フロー ここでも、前述のmovie_display.cfmと同様、データソースsampleのテーブル movieから情報を引き出します。

■図3-2-4 処理フロー sampleデータベース

movie_select.cfm

データの読み込み movieテーブル

■movie_select.cfm <cfquery datasource="sample" name="get_movie"> SELECT year,title From movie WHERE country='アメリカ' </cfquery> <html> <head> <title>映画のリスト</title> </head> <body> <h1>映画のリスト</h1> <table border="3"> <tr> <td><b>年</b></td> <td><b>タイトル</b></td> </tr> <cfoutput query="get_movie"> <tr> <td>#year#</td> <td>#title#</td>

63


</tr> </cfoutput> </table> </body> </html>

■図3-2-5 movie_selet.cfmの表示結果

64


3章 データベースをスパイスに

図3-2-5は、movie_select.cfmの実行結果です。図3-2-1の「movie」テーブ ルと照らし合わせてみてください。アメリカ映画のみ、つまりデータベースの 「country」フィールドが「アメリカ」である映画のみ抽出されていることが確認で きます。movie_display.cfmの実行結果である図3-2-3と比較しても5作品減って います。その5作品は、アメリカ映画ではない5作品ですね(合作映画はテーブル 登録の段階で一カ国の国名のみ登録しています)。

65


3-3 テーブルの利用〈CFTABLE/CFCOL〉 データベーステーブルの結合 HTML同様テーブルを定義するタグ「CFTABLE」が存在することを紹介した いのですが、それだけではなく、合わせてデータベースの結合についても紹介しま す。また、「CFTABLE」は必ず「CFCOL」と一緒に利用します。 ここでは2種類のテーブルを結合させることを考えましょう。例として図3-2-1の 「movie」というテーブルと図3-3-1の「oscar」という2種類のテーブルを準備し ます。「movie」は先ほど使った映画のデータベーステーブル、 「oscar」は歴代の オスカー受賞映画を少しだけピックアップしたデータベーステーブルです。2つのテ ーブルを結合して抽出するのは、『オスカー受賞作品、その作品が公開された年、 第何回のオスカーなのか』です。「movie」テーブルからその作品の年を、 「oscar」 テーブルから第何回のオスカーなのかを「title」フィールドをキーにして抽出しま す。

■表3-3-1 oscarテーブルのフィールド

フィールド名

データ型とプロパティ

title

テキスト型、主キー

■図3-3-1 oscarテーブルのデータ

66


3章 データベースをスパイスに

処理フロー oscar_get.cfmが、データソースsampleの「movie」と「oscar」テーブルの両 方と連携をはかります。

■図3-3-2 処理フロー sampleデータベース

oscar_get.cfm

データの読み込み movieテーブル oscarテーブル

では、データベーステーブル結合の実行ファイルとなるoscar_get.cfmについて 見ていきましょう。

■oscar_get.cfm <cfquery name="Join" datasource="sample"> SELECT movie.title, oscar.title, movie.year, oscar.annual From movie, oscar Where movie.title=oscar.title </cfquery>

q

<html> <head> <title>オスカー</title> </head> <body> <h1>オスカー受賞作品の抽出</h1> <cftable query="Join" colheaders htmltable border> <cfcol header="年" text="#year#"> <cfcol header="タイトル" text="#title#"> <cfcol header="オスカー年度" text="#annual#"> </cftable>

w

67


</body> </html>

構文 <cftable query="クエリ名" ………… > <cfcol header="ヘッダー名" text="テキスト"> </cftable>

qのCFQUERYについて まず「CFQUERY」の中で、「movie」テーブルの「title」と「year」フィール ドと、「oscar」テーブルの「title」と「annual」フィールドを呼び出しています。 そしてWhereで「movie」テーブルの「title」フィールドと「oscar」テーブルの 「title」フィールドを比較し、同じタイトルのものを抽出しています。また、ここ でのクエリ名に「Join」という名前を付けています。

wのCFTABLEについて wでは「CFTABLE」というタグを利用していますが、これはHTMLの「TABLE」 タグの考 え方 とほぼ同 じと思 ってください。 主 な属 性 は後 述 しますが、 oscar_get.cfmでは「Join」という名のクエリでデータベースをサーチし、それを 出力させるので、「CFTABLE」の「query」属性も「Join」とし、HTMLテーブ ルを作成するように定義します。 そして、この「CFTABLE」タグの中で必ず利用するのが、「CFCOL」タグで す。「CFCOL」タグはその列の見出しを「header」属性で定義し、列の中身を 「text」属性で出力させます。その結果が図3-3-3です。 両方のテーブルに含まれている映画のタイトルだけ、つまり「movie」テーブル の中からオスカー受賞作が抽出されているのがわかるでしょう。そしてテーブルの 結合の結果として、確かにqで定義したように、 「movie」テーブルからはその作 品が公開された年、「oscar」テーブルからは、第何回のオスカーなのかという情

68


3章 データベースをスパイスに

報がそれぞれ引き出されています。 この出力結果はもちろん単にHTMLの「TABLE」タグを使っても得られるわけ ですが、「CFTABLE」タグを使って同様の結果を得るための手法をここでは紹介 しました。

■図3-3-3 oscar_get.cfmの表示結果

CFTABLEのhtmltable属性 wの「CFTABLE」タグで「htmltable」を指定しなければ、あらかじめ準 備されているテキストテーブルが表示されます。

69


CFTABLEとCFCOLの属性 CFTABLE colheaders

CFCOLで指定された各列のヘッダ表示

htmltable

HTMLのテーブルとしてテーブル表示

query

データを引き出すためのクエリ名

「colheaders」属性は列の見出しを表します。また、「htmltable」を指定すれ ば、その名の通りHTMLテーブルが作成されます。「query」は、CFOUTPUTの それと同じ感覚で、何から値を出力させるのかの指定を行います。

CFCOL align

列の配置

header

列名

text

出力するテキスト

width

列幅

「align」、 「width」はそれぞれ、設置する位置(左、真中、右) 、列の幅を示 します。 「header」は、列見出しに入れるテキストの指定、「text」は、出力する ものを指定します。

70


3章 データベースをスパイスに

71


3-4 データベースへのデータの追加〈CFINSERT〉 Webブラウザからデータベースにデータを書き込む これまで使ってきたmovieテーブルに新しい映画の情報をWebページから入力で きるようにしてみましょう。フォームはHTMLで作成します。まずは、図3-4-1の ファイルをadd_movie.cfmとして書いてみましょう。

■図3-4-1 add_movie.cfmの表示結果

72


3章 データベースをスパイスに

処理フロー add_movie.cfmはadding_movie.cfmへ処理を引き継ぎ、そこでデータソース sampleのテーブルmovieに情報を書き込みます。

■図3-4-2 処理フロー

add_movie.cfm sampleデータベース

[追加]をクリック

adding_movie.cfm

データの書き込み movieテーブル

■add_movie.cfm <html> <head> <title>データ追加</title> </head> <body> <h1>リストに映画を追加登録する</h1> <form action="adding_movie.cfm" method="POST"> <p> 映画のタイトル: <input type="text" name="title" size="30"> <br> 公開された年: <input type="text" name="year" size="15"> <br> 主演男優もしくは女優: <input type="text" name="actor" size="30">

73


<br> 国: <input type="text" name="country" size="20"> <br><br> <input type="submit" value="追加"> <input type="reset" value="リセット"> </form> </body> </html>

次にadd_movie.cfmが処理を引き継ぐページを書きます。adding_movie.cfm、 adding_movie2.cfmの2つのプログラムを紹介します。adding_movie.cfmはデー タの挿入にSQLのINSERTを利用し、adding_movie2.cfmは「CFINSERT」と いうCFMLのタグを利用しています。どちらを利用しても結果は同じですが、 「CFINSERT」を使った方がシンプルになります。

■adding_movie.cfm <cfquery datasource="sample"> INSERT INTO movie(year, title,actor,country) VALUES('#year#','#title#','#actor#','#country#') </cfquery> <html> <head> <title>データ追加</title> </head> <body> <h1>リストに映画が追加されました!</h1>

74

q


3章 データベースをスパイスに

<cfoutput>[#title#]が追加登録されました。</cfoutput> <br> <br> <a href="./movie_displayall.cfm">ここでリストを確認できます。</a> </body> </html>

qの部分でデータの追加を行っているのがポイントです。この形はぜひ覚えてく ださい。

■adding_movie2.cfm <cfinsert datasource="sample" tablename="movie"> <html> <head> <title>CFINSERTでのデータ追加</title> </head> <body> <h1>リストに映画が追加されました!</h1> <cfoutput>[#title#]が追加登録されました。</cfoutput> <br> <br> <a href="./movie_displayall.cfm">ここでリストを確認できます。</a> </body> </html>

構文 <cfinsert datasource="データソース名" tablename="テーブル名" ………… >

75


add_movie.cfm、adding_movie.cfm(またはadding_movie2.cfm)が用意 できたら、add_movie.cfmをWebブラウザで表示し、データを入力してみましょ う(図3-4-3を参照)。データを入力して[追加]ボタンをクリックすると、図34-4のような画面が表示されます。

■図3-4-3 add_movie.cfmでデータを入力する

76


3章 データベースをスパイスに

■図3-4-4 [追加]ボタンを押した結果の画面

adding_movie.cfm、adding_movie2.cfm両方とも、入力したデータがデータ ベースに反映されているかどうかを確認するためのハイパーリンクが用意されてい ます。リンク先に設定しているmovie_displayall.cfmは、本章の3-2で紹介した movie_display.cfmを少し加工して、「actor」と「country」フィールドの情報も 呼び出すように2列付け加えたものです。

77


■movie_displayall.cfm <cfquery datasource="sample" name="get_movie"> SELECT year,title,actor,country From movie </cfquery> <html> <head> <title>映画のリスト2</title> </head> <body> <h1>映画のリスト2</h1> <table border="3"> <tr> <td><b>年</b></td> <td><b>タイトル</b></td> <td><b>主演男優・女優</b></td> <td><b>国</b></td> </tr> <cfoutput query="get_movie"> <tr> <td>#year#</td> <td>#title#</td> <td>#actor#</td> <td>#country#</td> </tr> </cfoutput> </table> </body> </html>

図3-4-4で[ここでリストを確認できます。]をクリックすると図3-4-5の画面が 表示され、データ追加後の確認ができます。入力した「ユー・ガット・メール」

78


3章 データベースをスパイスに

がちゃんと追加され、データの数も16作品に増えていますね。これで、正しくデ ータが挿入されていることが確認できました。

■図3-4-5 movie_displayall.cfmの表示結果

CFINSERTの属性 CFINSERT datasource

データソース名

tablename

テーブル名

「datasource」はおなじみのデータソース名、「tablename」も文字通り挿入 されるテーブルの名前を定義します。

79


3-5 データベースの更新〈CFUPDATE〉 データベースの情報を変更する 今度はデータベースの情報を更新してみましょう。更新するためのプログラムは、 update_movie.cfmというファイル名にします。

処理フロー update_movie.cfmはmovieIDが正しく指定されていると、データソースsample のテーブルmovieから情報を引き出してフォームに表示します。その後、[更新] ボタンをクリックすると、処理をupdating_movie.cfmに引き継ぎます。 movieIDが指定されていなければエラーメッセージが表示されます。さらに、 updating_movie.cfmでも、情報を更新するためにデータソースsampleのテーブ ルmovieと連携をはかります。

■図3-5-1 処理フロー

movieIDが指定されている NO

エラーメッセージの表示 (update_movie.cfm)

YES

update_movie.cfm データを読み出す

sampleデータベース

[更新]をクリック

updating_movie.cfm

80

データの更新 movieテーブル


3章 データベースをスパイスに

■update_movie.cfm <cfif IsDefined("movieID") IS "No"> <h1>エラーが発生しました。movieIDが指定されていません。</h1> <cfabort> </cfif>

q

<cfquery datasource="sample" name="update"> SELECT year, title, actor, country FROM movie WHERE movieID=#movieID# </cfquery> <cfoutput query="update"> <html> <head> <title>データ更新</title> </head> <body> <h1>映画情報を更新する</h1> <form action="updating_movie.cfm" method="POST"> <input type="hidden" name="movieID" value="#movieID#"> 映画のタイトル: <input type="text" name="title" size="30" maxlength="30" value="#Trim(title)#"> <br> 公開された年: <input type="text" name="year" size="15" maxlength="15" value="#Trim(year)#"> <br> 主演男優もしくは女優: <input type="text" name="actor" size="30" maxlength="30" value="#Trim(actor)#"> <br> 国: <input type="text" name="country" size="20"

81


maxlength="20" value="#Trim(country)#"> <br><br> <input type="submit" value="更新"> <input type="reset" value="リセット"> </form> </body> </html> </cfoutput>

qの「IsDefined」という関数は、指定された変数が存在するか否かを調べ、存 在すれば「True」 、そうでなければ、「False」を返します(87ページ 関数4参照)。 ■図3-5-2 update_movie.cfmにmovieIDを指定して表示した結果

82


3章 データベースをスパイスに

このプログラムを表示するときにmovieID=16(前のセクションで加えた「ユ ー・ガット・メール」のmovieIDが16にあたります)とすると、図3-5-2のように 更新する元のデータが表示されます。movieIDを指定するには、URLの最後に 「?movieID=16」と付け加えます。movieIDを指定するとqのIsDefined関数は 「True」を返しますので、q以降の処理が実行されます。また、INPUTタグで使 われているTrim関数は前後のスペースを取り除きます(87ページ関数5参照)。 では肝心のデータベース更新の作業を引き継ぐupdating_movie.cfmを見てみま しょう。

■updating_movie.cfm <cfupdate datasource="sample" tablename="movie"> <cfoutput> <html> <head> <title>データ更新</title> </head> <body> <h1> #title#の情報が更新されました。</h1> <br> <br> <a href="./movie_displayall.cfm">ここでリストを確認できます。</a> </body> </html> </cfoutput>

構文 <cfupdate datasource="データソース名" tablename="テーブル名" ………… >

83


たとえばmovieID=16の「ユー・ガット・メール」の情報で、主な出演俳優を 「メグ・ライアン」から「トム・ハンクス」に変更し、[更新]ボタンをクリックす ると図3-5-4のように表示されます。

■図3-5-3 「メグ・ライアン」を「トム・ハンクス」に変更する

84


3章 データベースをスパイスに

■図3-5-4 [更新]ボタンをクリックした結果

movie_displayall.cfmへのハイパーリンクをクリックして、リストが正しく更新 できているかどうかを確認すると次ページの図3-5-5のようになります。ちゃんと 「 ユー・ ガット・ メール」 の俳 優 が更 新 されていることが確 認 できます。 「CFUPDATE」というひとつのタグで、こんなに簡単に情報が更新できるのです。

85


■図3-5-5 movie_displayall.cfmの表示結果

ただし、「CFUPDATE」はあまり複雑な更新はできませんので、そういう場合 は88ページの記事で紹介するSQL文での「UPDATE」を利用しましょう。

86


3章 データベースをスパイスに

CFUPDATEの属性 CFUPDATE datasource

データソース名

tablename

テーブル名

「CFUPDATE」も「CFINSERT」と同じように、その属性にdatasource、 tablenameを持ちます。

関数4 IsDefined それでは、update_movie.cfmで出てきた「IsDefined」という関数について述 べておきましょう(update_movie.cfmの先頭で使われていますね)。 IsDefined("valiable") これは、 「valiable」という変数が存在するか否かを判定する関数であり、存在 すれば「True」 、そうでなければ「False」を返します。変数の存在の有無を確認 する場 合 に、 非 常 によく使 われる関 数 ですので覚 えてください。 < c f i f IsDefined("valiable")>という形でよく使われます。

関数5 Trim update_movie.cfmの中で使われているTrim関数についても触れておきます。こ の関数は、 Trim(string) の形で使われ、前後のスペースを削除した文字列を返します。

87


タグ CFABORT update_movie.cfmの条件文でIsDefinedがFalseを返した場合、エラーメッセ ージを表示したあとに<cfabort>と書かれていることに気がついたでしょうか? これは、このタグの位置でColdFusionテンプレートの処理を停止しなさいとい うことを意味しています。 今回の例では、URL変数が定義されていなければエラーメッセージを表示して、 その後の処理を停止しなさい、ということになりますね。

SQL文の「UPDATE」 ここでは紹介しておりませんが、SQL文でのUPDATEも考え方はデータ追 加のINSERTと同じで、cfqueryの中でデータソースを指定して、その次の 行で、UPDATEとして、テーブル名を指定する形にします。あとは、SET の後ろに更新するフィールド名を順に書きます。たとえば以下のような感 じになります。 <cfquery datasource="sample"> UPDATE movie SET year='#year#', title='#title#' actor='#actor#' country='#country#' </cfquery>

88


3章 データベースをスパイスに

データを検索して更新する 先ほどの例では、URLでわざわざmovieID=16を指定しなくてはいけなかったの で、ちょっと使い勝手が悪いかもしれません。より単純に、ただ「あの映画の情 報を変えたい!」という場合にどうすればいいかについて考えてみましょう。つま り、更新したい映画情報をまず映画名で検索して引き出し、内容を確認したあと、 情報変更作業をするということを考えます。こちらの方が先ほどの例より実用的 でしょうか?

処理フロー ここで、映画名から登録されている情報を引き出すためのフォームをprepick.cfm、 引き出された情報を表示させるものをpickup.cfmとし、実際の更新作業は先ほど 登場したupdating_movie.cfmを使います。 3-5のupdate_movie.cfmとpickup.cfmはとても似たソースコードになっていま すが、INPUTタグのvalueに設定する値の表現のしかたが違っています。これは、 CFOUTPUTの使い方の問題ですが、どちらの使い方でも同じ結果が得られるこ とがわかると思います。

■図3-5-6 処理フロー

prepick.cfm [次へ]をクリック

pickup.cfm データを読み出す

sampleデータベース

[更新]をクリック

updating_movie.cfm

データの更新 movieテーブル

89


図3-5-7は映画名からデータベーステーブルに登録されているその映画情報を引 き出すprepick.cfmの画面です。 ■図3-5-7 prepick.cfmの表示結果

■prepick.cfm <html> <head> <title>映画情報更新</title> </head> <body> <form action="pickup.cfm" method="POST"> <p>更新したい情報がある場合、その映画のタイトルを入力してください。</p> <input type="text" name="title" size="30"> <input type="Submit" value="次へ"> </form> </body> </html>

90


3章 データベースをスパイスに

■pickup.cfm <cfquery datasource="sample" name="get_movie"> SELECT movieID,year,title,actor,country From movie WHERE title='#form.title#' </cfquery> <html> <head> <title>映画情報更新</title> </head> <body> あなたの更新したい情報はこれらでよろしいですか?<br> よろしければ、修正箇所を修正し、更新ボタンを押してください。<br> <form action="updating_movie.cfm" method="POST"> <input type="hidden" name="movieID" value="<cfoutput query="get_movie">#movieID#</cfoutput>"> <p> 映画のタイトル: <input type="text" name="title" size="30" value="<cfoutput query="get_movie">#title#</cfoutput>"> <br> 公開された年: <input type="text" name="year" size="15" value="<cfoutput query="get_movie">#year#</cfoutput>"> <br> 主演男優もしくは女優: <input type="text" name="actor" size="30" value="<cfoutput query="get_movie">#actor#</cfoutput>"> <br> 国: <input type="text" name="country" size="20" value="<cfoutput query="get_movie">#country#</cfoutput>"> <br><br> <input type="submit" value="更新"> <input type="reset" value="リセット"> </form> </body></html>

91


■図3-5-8 pickup.cfmの表示結果

■図3-5-9 「トム・ハンクス」を「メグ・ライアン&トム・ハンクス」に変更する

92


3章 データベースをスパイスに

図3-5-7のprepick.cfmに「ユー・ガット・メール」と入力して[次へ]をクリ ックした結果が図3-5-8です。ちゃんと情報がデータベースから引き出されていま すね。実際に試してみてください。ここでは、 「ユー・ガット・メール」の主演俳 優を二人にするということで、「トム・ハンクス」を「メグ・ライアン&トム・ハ ンクス」としてみましょう。[更新]ボタンをクリックすると処理が前述の updating_movie.cfmに引き渡され、更新が行われるわけです。その結果を図3-510に示します。

■図3-5-10 [更新]ボタンを押した結果

CFUPDATEを使った特定フィールドの更新 属性formfieldsを利用して、更新したいフィールドのみをリストアップする こともできます。以下のようになります。 <cfupdate datasource="xx", tablename="yy" formfields="a,b,c">

93


データベースのデータ削除 さて、データの更新は簡単にできたので、今度はデータの削除を考えてみましょ う。しかし、ColdFusionにはデータ削除のタグがないのです。ではどうするか? SQLの削除の定義を使ってみましょう。 まずは削除したい映画名をフォームに入力し、登録されている情報を確認後、 削除の実行を行うような流れにしましょう。

処理フロー 処理フローは、「更新」のときの考え方とほぼ同じです。まず、映画名を入力 するフォームをdelpick.cfm、登録されている情報を表示させるのがdelete.cfm、 削除の実行をするのがdeleting_movie.cfmとなります。

■図3-5-11 処理フロー

delpick.cfm [次へ]をクリック

delete.cfm データを読み出す

sampleデータベース

[削除]をクリック

deleting_movie.cfm

94

データの削除 movieテーブル


3章 データベースをスパイスに

■delpick.cfm <html> <head> <title>映画情報削除</title> </head> <body> <form action="delete.cfm" method="POST"> <p>データベーステーブルから削除したい映画がある場合、その映画のタイトルを入力し てください。</p> <input type="text" name="title" size="30"> <input type="Submit" value="次へ"> </form> </body> </html>

■図3-5-12 delpick.cfmの表示結果

95


■delete.cfm <cfif title IS ""> タイトルが入力されていません。<br> もう一度やり直してください。 <cfabort> </cfif> <cfquery datasource="sample" name="get_movie"> SELECT year,title,actor,country From movie WHERE title='#form.title#' </cfquery> <html> <head> <title>映画情報削除</title> </head> <body> あなたの削除したい映画はこれでよろしいですか?<br> よろしければ、削除ボタンを押してください。<br> <p> 誤った映画を選択してしまった場合、 「戻る」ボタンで、もう一度削除希望の映画名を 入力してください。 </p> <form action="deleting_movie.cfm" method="POST"> □■□■□■□■□■□■□■□■□■□■□■□■ <p> 映画のタイトル: <cfoutput query="get_movie">#title#</cfoutput> <br> 公開された年: <cfoutput query="get_movie">#year#</cfoutput> <br> 主演男優もしくは女優: <cfoutput query="get_movie">#actor#</cfoutput> <br> 国: <cfoutput query="get_movie">#country#</cfoutput><br><br>

96


3章 データベースをスパイスに

□■□■□■□■□■□■□■□■□■□■□■□■ <br><br> <input type="Hidden" name="name" value="<cfoutput>#form.title#</cfoutput>"> <input type="Submit" value="削除"> </form> <form action="delpick.cfm" method="post"> <input type="Submit" value="戻る"> </form> </body></html>

今回はCFINSERTで加えたユー・ガット・メールのデータを削除してみること にしました(図3-5-13)。 また、ここでもCFQUERYでデータソース名を指定して、次の行でmovieとい うテーブルからフォームで入力されたタイトルと一致するタイトルの情報を表示さ せ、削除の実行前の確認を行わせているわけです。 ■図3-5-13 delete.cfmの表示結果

97


■deleting_movie.cfm <cfquery datasource="sample"> DELETE FROM movie <cfif name IS NOT ""> WHERE title LIKE '#name#%' </cfif> </cfquery> <html> <head> <title>データ削除</title> </head> <body> <h1>削除完了</h1> <a href="./movie_displayall.cfm">ここでリストを確認できます。</a> </body> </html>

deleting_movie.cfmの考え方はadding_movie.cfmとまったく同じです。図3-51 3 で[ 削 除 ] ボタンをクリックすると、 つまり削 除 処 理 を引 きうける deleting_movie.cfmが実行されれば、簡単にデータを削除することができます。

98


3章 データベースをスパイスに

■図3-5-14 deleting_movie.cfmの表示結果

URL変数を使ったデータ削除 では参考までに、CFUPDATEのところで使ったようにIDをキーにして削除する 場合も紹介します。これをdelete_movie_ID.cfmとします。

■delete_movie_ID.cfm <cfif IsDefined("movieID") IS "No"> <h1>エラーが発生しました。movieIDが指定されていません。</h1> <cfabort> </cfif> <cfquery datasource="sample"> DELETE FROM movie WHERE movieID=#movieID# </cfquery>

q

99


<html> <head> <title>データ削除</title> </head> <body> <h1>削除完了</h1> <a href="./movie_displayall.cfm">ここでリストを確認できます。</a> </body> </html>

qで選択されたmovieIDの情報をテーブルmovieから削除すると定義します。こ れを実行すると簡単にデータベースからデータを削除することができるのですが、 IDの値をひとつ間違えると意図しない情報が消されてしまったりするかもしれない ですね。実際はこのように直接ユーザーがURL変数を使うことはあまりなく、前の ファイルからの値の引継ぎで処理を実行する場合などにこのURL変数を使うこと になるでしょう(第5章参照)。ここでは、logicだけ覚えてください。 図3-5-15はdelete_movie_ID.cfmをmovieID=16に対して実行したときの表示 です。movieID=16は3-4でデータの追加の例にあげた「ユー・ガット・メール」 の情報が入力されています。ハイパーリンクをクリックしてデータベース内容を確 認すると、 「ユー・ガット・メール」が削除されているのを確認できます(図3-516) 。

100


3章 データベースをスパイスに

■図3-5-15 movieIDを指定してdelete_movie_ID.cfmを表示した結果

■図3-5-16 movie_displayall.cfmの表示結果

101


ちょっと休憩 条件設定「WHERE」について ■表 条件表記とその意味

102

条件表記

意味

=

等価

<>

不等価

<,<=,>,>=

大小比較

BETWEEN

2つの仮定された値の間

IN

列挙したリストの中に値が含まれているか否か

IS NULL

NULLの値をもっているか否か

IS NOT NULL

NULLでないか否か

LIKE

特別な文字パターンと一致するか否か


3章 データベースをスパイスに

■表 条件表記と利用例

条件表記

利用例

=

WHERE Title = ‘エイリアン’ 適合するもの

<>

タイトルがエイリアンのもの WHERE Title <> ‘エイリアン’

適合するもの <,<=,>,>= 適合するもの BETWEEN 適合するもの IN

タイトルがエイリアン以外のもの WHERE Number < ‘4’ 4以下の数(3.9….3…2.5….) WHERE Number BETWEEN ‘0’ AND ‘8’ 1,2,3,4,5,6,7など0から8の間の数 WHERE Title IN (‘エイリアン’ , ‘ゴースト’, ‘タイ タニック’) = {WHERE Title = ‘エイリアン’ OR Title =‘ゴースト’ OR Title =‘タイタニック’}

適合するもの IS NULL 適合するもの IS NOT NULL 適合するもの LIKE

エイリアンかゴーストかタイタニック WHERE Title IS NULL タイトルが空欄のもの WHERE Title IS NOT NULL タイトルが空欄でないもの WHERE Title LIKE ‘A%’ --- Aで始まる文字列

適合するもの LIKE

ARIANなど WHERE Title LIKE ‘%A%’ --- Aがそのどこかに含ま れている文字列

適合するもの LIKE

WHERE Title LIKE ‘%A’ --- Aで終わる文字列

適合するもの NOT

TITANIC など

LIKE

GOZIRA など WHERE Title NOT LIKE ‘A%’ --- Aで始まらない文 字列

適合するもの NOT

LIKE

GHOST, TITANICなど WHERE Title NOT LIKE ‘%A%’ --- Aがそのどこに も含にもまれていない文字列

適合するもの NOT

LIKE

GHOSTなど WHERE Title LIKE ‘%A’ --- Aで終わらない文字列

103


3-6 ダイナミックドキュメント〈CFLOCATION〉 自動的にページをジャンプ! 3-4、3-5と、データの追加、更新、削除をしてきましたが、そのたびに「映画 をひとつ加えましたよ。確認はここをクリックして全リストを見てください」とい う手続きをしてきましたね。これはこれでいいのでしょうが、せっかちな人などは こういう手続きなしで「データを加えたらすぐリストをみたい!」などと思うので はないでしょうか? CFMLでこれを実行する方法を紹介しましょう。 方法は何よりシンプル。3-4のadd_movie.cfmを例にあげますが、このフォーム で処理を引き継いでいるのがadding_movie.cfmもしくはadding_movie2.cfmで した。では、adding_movie2.cfmの方を例にとってみましょう。これも元々シン プルなプログラムなのですが、更にこれをたった2行のコードにしてしまいましょう。

処理フロー add_movie.cfmで は 、 「 add_movie.cfm →

adding_movie.cfm →

movie_displayall.cfm」という処理フローでしたが、今回は「add_movie.cfm → adding_movie_jump.cfm → movie_displayall.cfm」というフローになります。

■図3-6-1 処理フロー

3-4で作成したページの場合

CFLOCATIONを使ったページの場合

add_movie.cfm

add_movie.cfm

[追加]をクリック

adding_movie.cfm リンクをクリック

movie_displayall.cfm

104

[追加]をクリック

adding_movie_jump.cfm 自動的に移動

movie_displayall.cfm


3章 データベースとの連携

■adding_movie_jump.cfm <cfinsert datasource="sample" tablename="movie"> <cflocation url="./movie_displayall.cfm">

q

構文 <cflocation url="ファイル名" ……… >

そして、add_movie.cfmのFORMタグのaction属性をadding_movie_jump.cfm に設定しておきます。こうしてしまえば、add_movie.cfm(図3-4-3)の[追加] ボタンを押したら、すぐにmovie_displayall.cfmの画面(図3-4-5)になるわけで す。実験してみてください。 これができればすごく楽じゃないでしょうか? ほらもうあなたは頭に思い浮かべ ているでしょう。たとえばWebサイトが引越しをしたとき、それを知らずに古い URLにアクセスしてきたユーザーがいたとします。

■図3-6-2 URLが変更されたページの例

105


図3-6-2のように、 「このページは移動しました。リンクをクリックして移動して ください。」と表示しておき、ハイパーリンクで新しいページに誘導する方法もあ りますが、それがいやだなぁという人はどうすればいいでしょうか? こんなときは、このCFLOCATIONを使って自動的に新しいページに導いてあげ ることもできますね。つまり、引越す前のファイル、たとえばmove.cfmというフ ァイルに、adding_movie_jump.cfmで紹介したqの部分を書いておけば、自動 的に新しいページにジャンプするわけです。ぜひ有効活用しましょう。

CFLOCATIONの属性 url

表示するページのURL(必須)

addtoken

Yes/No(クライアント変数情報の追加)

「CFLOCATION」以降は無視される 「CFINCLUDE」 (2-2参照)とは違って、この「CFLOCATION」タグより後ろ にあるコードは無視されますので気をつけてください。つまり指定されたページに 飛んだら、もう戻っては来ない後戻り不能という意味です。

「CFLOCATION」が使えない場合 第5章まで行ってつまずいたらここに戻ってきてください。CFLOCATIONは Cookie情報などをジャンプ先のページまで運びません。そのような場合はHTML でたとえば、 <meta http-equiv="refresh" count="0;URL=xxx.cfm"> のように記述する対処法が考えられます。

106


3-7 変数を定義する〈CFSET/CFPARAM〉 表示させる情報件数の制限 3-2でデータベース情報をブラウザ上に表示させる方法を学びましたが、たとえ ば膨大なデータベースであった場合、それを一度に表示させるととても見にくいで しょう。そこで、数行で区切って表示させる方法を考えてみます。たとえば5行で 区 切 るとすると、 図 3 - 7 - 1 のように表 示 されればいいわけです。 これを movie_display_sep.cfmとします。

■図3-7-1 movie_display_sep.cfmの表示結果

「CFSET」というタグを使って行数を表す変数「MaxRows」を定義します。 ちなみに「CFSET」に属性はありません。

107


■movie_display_sep.cfm <cfset MaxRows = 5>

q

<cfparam name="top" default="1">

w

<cfquery datasource="sample" name="get_movie"> SELECT year, title, actor, country From movie </cfquery> <html> <head> <title>映画のリスト</title> </head> <body> <h1>映画のリスト3</h1> <table border="3"> <tr> <td><b>年</b></td> <td><b>タイトル</b></td> <td><b>主演男優・女優</b></td> <td><b>国</b></td> </tr> <cfoutput query="get_movie" startrow="#top#" MAXROWS="#MaxRows#"> <tr> <td>#year#</td> <td>#title#</td> <td>#actor#</td> <td>#country#</td> </tr> </cfoutput> </table> <cfset NextStart = top + MaxRows> <cfoutput> <form action="movie_display_sep.cfm" method="POST"> <input type="Hidden" name="top" value="#NextStart#"> <input type="submit" value="次の#MaxRows#件">

108

e

r


3章 データベースとの連携

</form> </cfoutput> </body> </html>

構文 <cfparam name="パラメータ名" default="初期値" ……… >

movie_display_sep.cfmは、movie_display.cfmに少し手を加えているファイ ルです。 qで「MaxRows」という変数に「5」をセットしています。この値をeの 「CFOUTPUT」の属性「MAXROWS」で利用し、表示する行数を5としている わけです。では、wではなぜ「CFSET」を使わないのでしょうか? それはrの「NextStart」のセットで次のページは何行目から表示させるかを計 算し、 「Hidden」でその値を渡しているわけですが、ここで<cfset top=1>と定義 してしまうと、次のページもまた1行目から始まってしまうからです。こういうとき はwのように「CFPARAM」を使います。 「CFPARAM」は、まず変数の存在の有無を確認し、もしも存在しなければ、 既定値の設定が可能なタグです。 具体的に説明すると、wで「topという名の変数(つまり表示する最初の行番 号の変数)が存在しなければ、その変数に1を設定しなさい」としています。「も しも変数が存在する場合(これは、2回目以降の表示、つまり6行目以降の表示 の場合)はその値をそのまま保持して処理を続けなさい」という命令になります。 「CFSET」の場合は変数がその場で存在していても上書きしてしまうので、ここ では「CFPARAM」を使わなければならないのです。わかりましたか?

109


[次の5件]をクリックすると図3-7-2の画面になります。ちゃんと6行目から表 示されていますね。

■図3-7-2 [次の5件]をクリックした結果の画面

CFPARAMの属性 CFPARAM

110

name

パラメータ名

default

初期値


3-8 インデックスループとクエリループ〈CFLOOP/CFBREAK〉 インデックスループによる奇数表示 今度は「CFLOOP」を紹介しましょう。文字通りループ(処理の繰り返し)を 実行するタグです。 まずはとても簡単な使い方を紹介します。このファイルをcount.cfmとし、数字 を2ずつ飛ばして1から10まで表示しなさい、というコードにしています。

■count.cfm <html> <head> <title>ループ</title> </head> <body> <h1>2つおきの数字のカウント</h1> <cfloop index="temp" from="1" to="10" step="2"> <cfoutput><font size="4">#temp#, </font></cfoutput> </cfloop> </body> </html>

とても単純です。「CFLOOP」タグの中で変数を「index」属性で指定し(こ の場合tempとしています)、それを1から10までstep値2で表示するよう書いてい ます(図3-8-1参照)。

111


■図3-8-1 count.cfmの表示結果

クエリループによる映画情報表示 では、これを応用してデータベース情報を表示してみましょう。何をするかとい うと、これまで何度もデータベースの情報をWebブラウザ上に表示させてきました が、基本的にはまた同じことをします。ただまったく同じではおもしろくないので、 「CFLOOP」を使ってデータベーステーブルの後半部分だけを表示させることにし ましょう。これをloopdisplay.cfmとします。 ■loopdisplay.cfm <cfset movie_list=ArrayNew(2)>

q

<cfquery name="get_movie" datasource="sample"> select * from movie </cfquery> <cfoutput query="get_movie"> <cfset count = get_movie.recordcount> <cfset half = Int(count / 2)+1> </cfoutput> <html>

112

w e


3章 データベースとの連携

<head> <title>映画のリスト</title> </head> <body> <h1>映画のリスト</h1> <cfoutput> リストに登録されている映画の本数は#count#。<br> 下は登録数の半分のデータ表示。<br> </cfoutput> <hr> <cfloop query="get_movie"> <cfset movie_list[CurrentRow][1] =get_movie.year[CurrentRow]> <cfset movie_list[CurrentRow][2] =get_movie.title[CurrentRow]> </cfloop>

r

<table border="1"> <tr> <td><b>年</b></td> <td><b>タイトル</b></td> </tr> <tr> <cfloop index="loop" from="#half#" to="#count#"> <td> <cfoutput>#movie_list[loop][1]#</cfoutput> </td> <td> <cfoutput>#movie_list[loop][2]#</cfoutput> </td> </tr> </cfloop> </table>

t

<BR> </body> </html>

113


q、w、eでは、先ほどのセクションで学んだ「CFSET」をさっそく使ってい ます。では、まずqから順を追って解説していきましょう。

qのCFSETについて ここでは、「movie_list」という2次元配列を定義しています(関数7参照)。

wのCFSETについて wでは、 「get_movie」クエリで抽出されたレコードがいくつあったかを「count」 という変数に設定しています。

eのCFSETについて データを表示するときに、今回はデータベーステーブルの後半部分だけという条 件がありますので、真ん中を定義するためにInt関数(116ページ 関数6参照)を 利用して「half」という変数を定義しています。

rのCFLOOPについて ここでやっと「CFLOOP」が登場します。ここでは、qで定義した2次元配列 に値をセットしています。具体的にいうと、「get_movie」という名前のクエリで データを抽出するわけですが、「そのデータフィールドyearについての現在行を2次 元配列movie_listの現在行の1にセットし、titleについての現在行を2次元配列 movie_listの現在行2にセットすることを繰り返しなさい」という命令になってい ます。ここでCurrentRowは文字通り、現在行を示します。 これで、すべての行に対してデータがサーチされ、「movie_list」配列にセット されたはずです。

tのCFLOOPについて tで変数を「loop」とし、eで計算したレコードカウント(この場合、行数と 考えてよい)の半分の値を開始とし、レコードカウント(最終行)まで「loop」 変数を1ずつ上げながらループをしなさいと書いています。この中で「movie_list」 の行数が「loop」の値の増加とともに増し、 「year」、「title」について1行ずつ書 き出しなさいということになるわけです。ちょっとややこしかったでしょうか? ゆ っくり考えてみてください。 その結果は、図3-8-2のようになります。

114


3章 データベースとの連携

■図3-8-2 loopdisplay.cfmの表示結果

CFLOOPの属性 CFLOOPの属性の組み合わせ 1) インデックスループ:index, From, To, Step 2) 条件付きループ:condition 3) クエリーループ:query, startrow, endrow 4) リストループ:index, list CFLOOPの属性は上のようにたくさんありますが、このような組み合わせで利 用されるのが一般的です。今回紹介したのは1と3です。

115


関数6 Int このセクションで出てきたIntという関数にも触れておきましょう。これは、 Int(valiable) という形で利用され、整数を出力する関数ですが、変数valiableが小数の場合、 valiableの値に最も近く、小さい整数を出力します。つまり切り捨てをするわけ で、変数が3.5であれば3が出力されます。

関数7 ArrayNew この関数は1次元から3次元までの配列を作る関数です。 ArrayNew(number) のように定義します。 loopdisplay.cfmでは「movie_list」という2次元配列を定義していますね。 <cfset movie_list = ArrayNew(2)> としているはずです。

CFBREAKについて 参考までに、このループを「ある条件に一致したときに抜ける」という処理をす るには、<cfbreak>タグを使います。

116


3-9 条件文〈CFSWITCH/CFCASE〉 switch文による映画の国名表示 ここで軽く、条件文で使う「CFSWITCH」について紹介しましょう。これは必 ずそのタグ内でもうひとつのタグ「CFCASE」とセットで利用します。簡単に言 ってしまえば、条件文のセットということになるでしょう。「CFELSEIF」を多用 する場合は、代わりに「CFSWITCH」を利用するとわかりやすくなる場合があり ます。では、どのような使い方をするのか、さっそく見ていきましょう。 これまで何度も何度も繰り返し、データベース情報の抽出を行ってきましたが、 今度もまた同じです。その抽出方法を変えているだけです。switch.cfmを見て、 どういう形の出力になるのか今度は自分で想像をしてみてください。

■switch.cfm <cfquery datasource="sample" name="get_movie"> SELECT title, country From movie </cfquery> <html> <head> <title>映画のリスト</title> </head> <body> <cfoutput query="get_movie"> <cfswitch expression="#country#"> <cfcase value="アメリカ"> <h3>[#title#]はアメリカ映画です。</h3> </cfcase>

q w

<cfcase value="日本"> <h3>[#title#]は日本映画です。</h3> </cfcase>

e

<cfcase value="中国"> <h3>[#title#]は中国映画です。</h3> </cfcase>

r

117


</cfswitch> </cfoutput> </body> </html>

構文 <cfswitch expression="式"> <cfcase value="値" …… >…………</cfcase> </cfswitch>

CFSWITCHとCFCASEの属性 CFSWITCH expression

CFCASE

ColdFusionの式(必須)

条件設定

value

expressionで指定した式と比較する値(必須)

delimiters

区切り文字指定(オプション)

qの「CFSWITCH」でまず「country」について、という条件提示をし、その 中の「CFCASE」で、その値が「アメリカ」であるならばw、「日本」であるな らばe、「中国」であるならばrと、条件に一致した場合の処理を分岐して、実 行コードを書いています。これで、これらのタグを使って「movie」テーブルから 情報を引き出すことができることも確認できましたね。あなたの想像した出力結果 と図3-9-1は同じでしょうか?

118


3章 データベースとの連携

■図3-9-1 switch.cfmの表示結果

Switch文の考え方 これはIF文ににており、多分岐命令といわれております。複数の条件を設定し、 それの条件に一致する場合処理を実行するということになります。 一般的に構文は Switch(変数) { case 条件1 実行命令 case 条件2 実行命令 ・ ・ } となります。

119


具体的には、If文の考え方のコーナー(50ページ)で出てきた条件と同じよう なものを例としてあげれば、 Switch(「曜日」) { case 「月曜日」 「スポーツクラブに行く」 case 「火曜日」 「カレーライスを作る」 case 「水曜日」 「まっすぐ部屋に戻る」 case 「木曜日」 「六本木に遊びに行く」 case 「金曜日」 「映画をみにいく」 case 「土曜日」 「勉強をする」 case 「日曜日」 「終日寝ている」 } となります。 これをCFMLで書くと <cfswitch expression=「曜日」> <cfcase value = 「月曜日」> 「スポーツクラブに行く」</cfcase> <cfcase value = 「火曜日」> 「カレーライスを作る」</cfcase> <cfcase value = 「水曜日」> 「まっすぐ部屋に戻る」</cfcase> <cfcase value = 「木曜日」> 「六本木に遊びに行く」</cfcase> <cfcase value = 「金曜日」> 「映画をみにいく」</cfcase> <cfcase value = 「土曜日」> 「勉強をする」</cfcase> <cfcase value = 「日曜日」> 「終日寝ている」</cfcase> </cfswitch> となります。

120


3-10 ファイルの対話処理〈CFFILE〉 画像ファイルのアップロードと出力 今度は、「CFFILE」というタグについて勉強しましょう。これは、要するにフ ァイルとの対話処理(アップロード等)をする際に利用するタグで、たとえば ColdFusionを使った日記のページなどをWeb上で公開しているとしましょう。そ して日記の入力をWebブラウザから行って、その日撮った写真を公開しようとす る場合を考えてみてください。どのような手続きが必要か順に並べてみると、 1. Webブラウザから日記の内容と画像ファイル名の入力 2. 日記の内容の格納と画像ファイルのサーバーへのアップロード 3. 公開ページへの日記内容と画像ファイルの出力 というような具合でしょうか。 つまり、画像ファイルについては、ファイル名をデータベーステーブルに登録す ると同時にサーバーにそのファイル自体をアップロードしなくてはいけないですね。 でも、日記を書いたあとで、わざわざFTPソフトを使って画像をアップロードする のも面倒でしょう。「CFFILE」を利用すれば、FTPを使わなくても画像を別ディ レクトリへアップロードできるので、煩わしさがなく、日記をつける快適な環境を 作れるのです。 ここでは、日記の代わりに画像とそれについてのメッセージを入力して、公開ペ ージでそれを確認してみます。まず初めに必要な手続きに相当する条件などを考え ましょう。 1. Webブラウザからメッセージ入力と画像ファイル選択 (upload.cfm) 2. a) 画像ファイルのアップロード(upload.cfm) b) 画像ファイル名とメッセージをデータベーステーブルに書 き込む(upload.cfm) 3. メッセージと画像のサーバー上での表示(uploaded.cfm)

121


<その他の条件> データベーステーブル名:uploadfiles 写真名のフィールド名:image メッセージ:誕生日おめでとう 画像ファイル名:happybirthday.gif という条件で試してみましょう。

処理フロー ここでの処理フローは、まず入力画面のupload.cfmで画像の選択とメッセージ 入力を行います。そして、[画像送信]をクリックすると、upload.cfm自身の CFFILEにより指定したディレクトリへ画像がアップロードされます。[終了]をク リックするとuploaded.cfmへ移り、入力したメッセージと画像が一緒に表示され るというフローになります。

■図3-10-1 処理フロー

upload.cfm

[画像送信] をクリック

データの 書き込み [終了]をクリック

uploaded.cfm

122

sampleデータベース

uploadfilesテーブル


3章 データベースとの連携

入力画面は図3-10-2のようなものを準備します。このファイルの名前を upload.cfmとします。

■図3-10-2 upload.cfmの表示結果

■表3-10-1 uploadfilesテーブルのフィールド

フィールド名

データ型とプロパティ

id

オートナンバー型、主キー

message

テキスト型

123


■upload.cfm <cfset finished = "no"> <cfif IsDefined("Form.action")> <cfswitch expression="#Form.action#"> <cfcase value="画像送信"> <cftry> <cfif form.image IS NOT ""> <CFFILE ACTION="Upload" FILEFIELD="image" DESTINATION="c:\temp\" Nameconflict="OVERWRITE"> </cfif> <cfset image = Listappend("#File.ClientFilename#", "#File.ClientFileExt#", ".")> <cfquery datasource="sample"> INSERT INTO uploadfiles(message, image) VALUES('#form.message#', '#image#') </cfquery> <cfcatch type="any"> 画像をアップロードしている最中、データベースへの書き込みの際のどちらかで エラーが発生しました。 </cfcatch> </cftry> <cfset finished = "yes"> </cfcase> <cfcase value="終了"> <cflocation url="uploaded.cfm" addtoken="No"> </cfcase> </cfswitch> </cfif> <html> <body text="#00000"> <cfif finished EQ "no"> <h1>画像ファイルのアップロード</h1>

124

q w

e


3章 データベースとの連携

<form action="upload.cfm" method="post" onsubmit="return validate()" name="myForm" ENCTYPE="multipart/form-data">

r

<font size="2"> 画像ファイル </font><br> <input size="55" type="File" name="image"><br><br> <font size="2"> メッセージ </font><br> <textarea cols="35" rows="5" name="message"></textarea> <input type="submit" name="action" value="画像送信"> </form> <cfelse>

t y

<form action="upload.cfm" method="post"> <input type="submit" name="action" value="終了"> <input type="submit" name="action" value="更に画像送信"> </form> </cfif> </body> </html>

随分と長いファイルでうんざりするかもしれませんが、少し我慢して読んでみま しょう。

1. Webブラウザからメッセージ入力と画像ファイル選択 まずは、Webブラウザからメッセージを入力するため、画像ファイルを選択する ためのフォームを作成する過程を考えます。

125


<cfset finished = "no"> <cfif IsDefined("Form.action")>

まず最初に上記のコードにお目にかかります。1行目はfinishedという変数に 「no」をセットしています。この変数の使い道はあとで解説します。2行目は Form.actionという変数があるかどうかを調べています。しかし、この変数はまだ 存在しないので、eの</cfif>まで飛びます。 そうするとHTMLの部分がみえます。その先頭部分は、以下のようになっていま すね。

<cfif finished EQ "no">

ここで先ほどのfinishedの値が「yes」か「no」かを調べています。最初に定義 したように、ここではまだ「no」なので次の行に進みます。

<h1>画像ファイルのアップロード</h1> <form action="upload.cfm" method="post" onsubmit="return validate()" name="myForm" ENCTYPE="multipart/form-data"> <font size="2"> 画像ファイル </font><br> <input size="55" type="File" name="image"><br><br> <font size="2"> メッセージ </font><br> <textarea cols="35" rows="5" name="message"></textarea> <input type="submit" name="action" value="画像送信"> </form>

126


3章 データベースとの連携

HTMLでフォームを書いていますが、今回は画像ファイル選択の部分について 「input」のタイプで「file」を指定し、使用しているコンピュータのハードディス ク内から目的のファイルを参照できるように定義します。そして、メッセージを入 力できるようテキストボックスを定義します。 さらに、入力した値をこの同じupload.cfmで処理するようフォーム変数 (Form.action)を準備しています。 ここまでのイメージは、123ページの図3-10-2の通りです。

ここで[画像送信]ボタンをクリックした場合、rの <form action="upload.cfm"> で指定したように自分自身に戻ってきます。それでまた頭から処理が始まるように なっています。

<cfset finished = "no"> <cfif IsDefined("Form.action")> <cfswitch expression="#Form.action#"> <cfcase value="画像送信"> ∼中略∼ </cfcase> <cfcase value="終了"> ∼中略∼ </cfcase> </cfswitch> </cfif>

127


そしてフォームにデータを入力して[画像送信]ボタンをクリックすると、tで <input type="submit" name="action" value="画像送信"> としていますので、今度はForm.actionという変数が存在します。そのため、2行 目の <cfif IsDefined("Form.action")> という条件と一致し、その次の行に処理が進みます。 そして、3行目は3-9で紹介した「CFSWITH」 、 「CFCASE」を使っています。 ここではまず、form.actionについて、という条件を定義し、更にその値が「画像 送信」ならば、つまりユーザーがそのボタンをクリックしたなら、このタグ内のコ ードを実行しなさいということですね。 次に、その条件に合致すれば「CFFILE」の実行となるわけです。

2. a) 画像ファイルのアップロード ここで、メインである「CFFILE」を利用して画像ファイルのアップロードを行 います。

<CFFILE ACTION="Upload" FILEFIELD="image" DESTINATION="c:\temp\" NAMECONFLICT="OVERWRITE">

「CFFILE」の属性の中で、「ACTION」属性には「Upload」を指定し、 「DESTINATION」属性には画像ファイルをアップロードする先のディレクトリを 指定します。 「FILEFIELD」属性では、どのファイルをアップロードするのか(図 3-10-2で[参照]ボタンをクリックして画像選択するフィールドの値)を定義し、

128


3章 データベースとの連携

さらには「NAMECONFLICT」属性ですでにそのファイル名のファイルが存在す る場合の対処方を定義しています。この場合は「overwrite」としているので、上 書きされることになります。 これだけでファイルのアップロードができてしまうのは驚きですが、実際 ColdFusionではできてしまいます。では次に何を考えなくてはいけないかという と、今回の場合、アップロードした画像とメッセージを表示させるという目的があ りますので、アップロードしたファイルの名前とメッセージをデータベースに書き 込まなくてはいけませんね。メッセージの書き込みは今まで学んできた通りのこと をすればよいので簡単ですが、さて、選択した画像ファイル名はどうしましょう? ここでは、File変数を利用します。

2. b) 画像ファイル名とメッセージをデータベーステーブルへ書き込む <cfset image = Listappend("#File.ClientFilename#", "#File.ClientFileExt#", ".")>

このファイル変数は、フォームで選択したファイルについて、以下の情報を備え ています。 File.ClientFilename

拡張子抜きのファイル名

File.ClientFileExt

ファイルの拡張子

これらを結合すれば、「test.gif」などの形式のファイル名になるのです。これを 結合するには、Listappendという関数(132ページ 関数8参照)を使いましょう。 ここでは結合した文字列を「image」にセットして画像フィイル名としています。 さて、今度はすでに学習したデータベーステーブルへのデータ追加を行います。 もう、画像ファイル名(image)もメッセージ(message)も揃っているので、 データの追加が行えます。

129


<cfquery datasource="sample"> INSERT INTO uploadfiles(message, image) VALUES('#form.message#', '#image#') </cfquery>

この処理が終われば、パラメータ「finished」をyesにセットします。

<cfset finished = "yes">

続けてまたHTMLの部分に処理が移動しますが、今度はHTMLの上の部分にあ る「CFIF」は条件不一致となるので、yの<cfelse>へ行きます。

<cfelse> <form action="upload.cfm" method="post"> <input type="submit" name="action" value="終了"> <input type="submit" name="action" value="更に画像送信"> </form>

これらのHTMLがWebブラウザに表示されます(図3-10-3)。

130


3章 データベースとの連携

■図3-10-3 [画像送信]をクリックした結果の画面

ここでは、もうこれで作業がおしまいなら[終了]を、そうではなく、もうひと つ画像とメッセージを追加したい場合は、 [更に画像送信]をクリックできます。 [終了]ボタンをクリックすると、form.actionは「終了」という値を持ちます ので、「CFCASE」によりwの「CFLOCATION」が実行されるわけです。

<cfcase value="終了"> <cflocation url="uploaded.cfm" addtoken="No"> </cfcase>

131


では、[更に画像送信]をクリックしたときの処理はわかりますか? 一度画像送信を行っていますので、qでパラメータfinishedが「yes」の値を持 っています。しかし、ボタンをクリックすれば、upload.cfm自身に処理が引き継 がれますので、ここの先頭でまたfinishedを「no」に設定し直していますね。先ほ どは説明を飛ばしてしまいましたが、このfinished変数はこれで処理が終わりなの かどうかを判 断 するパラメータなのです。 次 に2 行 目 以 降 に続 きますが、 CFSWITCH中のCFCASEで[更に画像送信]に一致する部分がないので、その ままHTMLへ進み、初めのページとまったく同じページが表示されるわけです。

関数8 Listappend Listappend(string1, string2, mark) 書式は上のようになり、string1は結合したときに前部にくる文字列、string2は 後部の文字列、markはstring1とstring2の間に入る記号を示します。今回の場合 は、ファイル名を作成するので、markは「.(ピリオド)」ですね。

132


3章 データベースとの連携

アップロードされた画像とメッセージを出力 最後に[終了]ボタンをクリックし、アップロードした画像とメッセージを表示 します。このファイルはuploaded.cfmです。 ■uploaded.cfm <cfquery datasource="sample" name="get_image"> SELECT * FROM uploadfiles </cfquery> <html> <head> <title>画像とメッセージ</title> </head> <body> <cfoutput query="get_image"> <table border="0"> <tr> <td align="middle"><img src="C:\temp\#image#"></td> <td align="middle">#message#</td> </tr> </table> </cfoutput> </body> </html>

このファイルは3 - 2 のC F Q U E R Y で紹 介 したものと考 え方 は同 じです。 uploadfilesというテーブルから入力されたメッセージと画像を引き出しています。 実際に、「Happybirthday.gif」という画像とメッセージを入力し、[終了]を クリックしたときの結果が図3-10-4になります。表示されている画像は間違いな くアップロードされた画像ですね。

133


■図3-10-4 uploaded.cfmの表示結果

ここでは、「CFFILE」の「ACTION」属性が「Upload」のもののみ紹介しま した。 「ACTION」属性は多岐に渡り、さらにそこから使える属性が分かれていま すので、表にまとめてみたいと思います。オプション属性については、ここでは省 くことにします。 ■表3-10-2 CFFILEのACTION属性

134

ACTION属性

利用できる属性

UPLOAD

Destination, filefield

MOVE

Source, destination

RENAME

Source, destination

COPY

Source, destination

DELETE

File

READ

File, variable

READBINARY

File, variable

WRITE

Output, file


3章 データベースとの連携

CFTRY/CFCATCHタグ upload.cfmの中で見知らぬCFTRY/CFCATCHというタグが出てきましたね。 せっかくなので、触れておきましょう。 これらは、2つセットで使うタグです。ではどのようなときに利用するのか? と いうことですが、ColdFusionテンプレートの中での例外エラーを検出し、処理を 行うものです。うーん、なんだかわかりにくい? では具体的に……。 構文は、以下のようになります。

構文 <cftry> コード1 <cfcatch type="例外タイプ"> 任意に決められた例外処理のコード2 </cfcatch> </cftry>

「コード1」には何らかの処理内容を書きますが、わかりやすくするために <cfquery>タグがあると仮定しましょう。そのタグ中で、たとえば指定したデータ ソースが存在しなかった場合、このcftryブロックが例外エラーをキャッチし、「例 外処理コード2」を実行するわけです。ただし、指定したデータソースが存在しな いのではなく指定し忘れていた場合などは、構文エラーとなりますので例外エラー としては処理されません。

135


ちょっと休憩 文字列関数遊び Listappendという文字列関数を学んだところで、せっかくなので他の文字列関 数のいくつかを紹介しておきましょう。

Len関数 Len(string)

文字列「string」の長さを返します

Left関数 Left(string, count)

文字列「string」の左から「count」番 目までを返します

Reverse関数 Reverse(string)

文字列「string」を逆さまにしたものを 返します

Find関数 Find(mark, string)

文字列「string」中にある「mark」が 見つかる始めの位置を返します

Right関数 Right(string, count) 文字列「string」の右から「count」番 目までを返します これらをまとめて使っているのが右ページのstring.cfmで、138ページの図のよ うな結果になります。

136


3章 データベースとの連携

■string.cfm <cfset str = "C:/temp/happybirthday.gif"> <html> <head> <title>関数のテスト</title> </head> <body> <h3> <table border="1" bordercolor="#C281FE" bgcolor="#C281FE"> <tr><td align="middle"> <cfoutput><h3>#str#</h3></cfoutput> </td></tr> </table> <hr> 文字列の長さ: <cfoutput>#len(str)#</cfoutput><br> <br> 左から7文字: <cfoutput>#left(str, 7)#</cfoutput><br> <br> 文字列を逆表示: <cfoutput>#reverse(str)#</cfoutput><br> <br> <cfset restr = #reverse(str)#> 逆文字列を左からみてはじめに"/"が現れる場所 : <cfoutput>#Find("/",restr)#番目</cfoutput><br> <br> <cfset count = #Find("/",restr)# - 1> ファイル名のみの抜粋 : <cfoutput>#Right(str, count)#</cfoutput> </h3> </body> </html>

137


■図 string.cfmの表示結果

Aggregate Function ではもう少し休憩時間とし、これまで触れていなかったAggregate Functionに ついても紹介しておきましょう。これを使えば、たとえばmovieテーブルの「全体 数」をカウントすることもできます。その場合は、COUNT(*)という機能を使いま す。

■moviesummary.cfm <cfquery name="information" datasource="sample"> SELECT COUNT(*) AS How_many FROM movie </cfquery> <html> <head> <title>映画の本数</title> </head>

138


3章 データベースとの連携

<body> <h1>映画の本数</h1> <cfoutput> データベースに登録されている映画の本数: #information.How_many#本 </cfoutput> </body> </html>

■図 moviesummary.cfmの表示結果

139


C

O

L

U

M

N

SQLの基礎知識

SQLとはStructure Query Languageの略で、直

また、列のすべてを抽出するのではなく、なん

訳すると「構造化問い合わせ言語」となります。

らかの条件に一致したデータのみを抽出する場合

しかし、この言葉はわけがわからない表現かもし

は、WHEREという条件節を利用します。

れませんね。これは、表で整理されたデータに対

SELECT 列名1(プロバイダー)

する問い合わせ言語といえばわかりやすいでしょ

From テーブル名(isp)

うか? 表は誰でも目にしたことがあると思います

WHERE 列名2

が、たとえば下記の表のように、行と列で構成さ

の中でアメリカに相当するもの(country='アメリ

れたものを意味します。

カ')とすると、countryがアメリカになっている

以下にSQLの基本的なデータ操作を示します。

行のプロバイダーのみ抽出するということになる のです。

SELECT

データの抽出

INSERT、UPDATE、DELETEについても考

INSERT

データの追加

え方はまったく同じなので、書式についてのみ下

UPDATE

データの更新

記に記します。

DELETE

データの削除 INSERT INTO テーブル名 (列名1, 列名2, ...)

では実際の使い方はどうするのかというと、こ

VALUES(追加する値1, 追加する値2, ...);

こでも下記の表を例にあげてSELECTについて具 体的に解説しますが、表の中のある列について抽

UPDATE テーブル名

出したい場合、

SET 列名1 = 値1,列名2 = 値2, ... WHERE 条件;

SELECT 列名1(プロバイダー) DELETE

From テーブル名(isp)

FROM テーブル名 と書きます。するとプロバイダーと名付けられた

WHERE 条件;

列のみ抽出されることになります。 ■表 テーブルisp

140

プロバイダー

country

comment

DION

日本

KDDI

earthlink

アメリカ

Sprint

netzero

アメリカ

無料ISP

OCN

日本

NTTコミュニケーションズ


探し物は何ですか? 検索 本章では、検索機能についての紹介をします。自 分のサイトにある膨大なファイルから、あるキー ワードを含む文書の検索などが容易にできるよう になります。

4


4-1 データベースの検索〈CFQUERYによる検索〉 CFQUERYを使ったデータ検索 映画のデータベースばかり使っていたのでそろそろ飽きてしまったでしょうか? ちょっと気分を夏にして、花火大会の予定を入力したデータベーステーブルから、 開催する月と場所で検索するというストーリーで考えてみましょう。データベース テーブルは「fireworks」を使います(図4-1-1、表4-1-1) 。

■表4-1-1 fireworksテーブルのフィールド

フィールド名

データ型とプロパティ

ID

オートナンバー型

Name

テキスト型

Prefecture

テキスト型

Local

テキスト型

Month

テキスト型

■図4-1-1 fireworksテーブルのデータ

142


4章 探し物は何ですか?

処理フロー fireworks.cfmから検索するパラメータを受け取り、firesearch.cfmがデータベ ーステーブルfireworksの中を検索します。

■図4-1-2 処理フロー

fireworks.cfm [検索]をクリック

firesearch.cfm

sampleデータベース

データの読み取り fireworksテーブル

■図4-1-3 fireworks.cfmの表示結果

143


考え方はとてもシンプルで、SQLでPrefectureが「東京」、Monthが「8月」の 2つの条件を満たすもののみ抽出するように定義すればいいわけです。「東京」や 「8月」というパラメータはフォームで渡すような形にします。それが図4-1-3であ り、プログラムはfireworks.cfmです。

■fireworks.cfm <html> <head> <title>花火大会を検索</title> </head> <body> <h1>花火大会スケジュール</h1><br> <h3>場所と日程の検索</h3><br> <cfform action="firesearch.cfm"> <p> 探したい都道府県名: <input type="text" name="Prefecture" size="20" maxlength="20"> <p> 探したい月: <input type="text" name="Month" size="10" maxlength="10"> <br> <p> <input type="Submit" value="検索"> </cfform> </body> </html>

fireworks.cfmからパラメータを受け取り、データを検索するfiresearch.cfmの コードを見てみましょう。

144


4章 探し物は何ですか?

■firesearch.cfm <cfquery datasource="sample" name="fire"> SELECT Name, Prefecture, Local, Month, Day From fireworks Where ID = ID <cfif Prefecture IS NOT ""> AND Prefecture LIKE '#Prefecture#%' </cfif>

q

<cfif Month IS NOT ""> AND Month LIKE '#Month#%' </cfif>

w

</cfquery> <html> <head> <title>花火大会スケジュール</title> </head> <body> <center> <h1>花火大会スケジュール</h1> <cfoutput> 検索結果:#fire.RecordCount# 件見つかりました。 </cfoutput><br><br> <table border="2"> <tr> <th>花火大会名</th> <th>都道府県</th> <th>月</th> <th>日</th> </tr> <cfoutput query="fire"> <tr> <td>#Name#</td> <td>#Prefecture#</td> <td>#Month#</td> <td>#Day#</td>

145


</tr> </cfoutput> </table> </center> </body> </html>

qの <cfif Prefecture IS NOT ""> AND Prefecture LIKE '#Prefecture#%' </cfif> は(44ページ 第2章 2-4のCFIF参照)、フォームの「Prefecture」に空ではない 何かが入力されていて、なおかつ、入力された文字列に一致するという条件を与 えています。つまり、この例のように「東京」という文字列が入力されたのなら、 「東京」で始まるものをデータベーステーブルの「Prefecture」フィールドから探 せ!ということを意味するのです。wも同じように考えてください。 これで、 「東京」と「8月」の両方に合致するデータが検索されたことになりま す。図4-1-5が検索した結果です。

146


4章 探し物は何ですか?

■図4-1-4 データを入力

■図4-1-5 firesearch.cfmの表示結果

147


4-2 サーチエンジン〈サイト内全文検索〉 サイト内検索 さて、これまではSQLを使ったデータベーステーブル内の検索を紹介してきまし たが、サイトの中を全文検索でキーワードにひっかかるファイルや文書を検索して みたい! と思い始めている頃じゃないでしょうか? ColdFusionを使えば、自分の サイトの中を検索させることができます。では、その手順を見ていきましょう(少々 手間がかかりますが、あしからず)。 ColdFusion Serverには、Verity Development Kitというものが含まれており、 これを利用すれば、高速かつ効果的なサイト検索を実現することが可能になりま す。では、利用するための手法ですが、まずは「Verity Collections」と呼ばれる ものを作らなければなりません。 「Verity Collections」とはドキュメントと単語イ ンデックス等を含むメタデータからなるグループ(コレクション) 、もっとわかりや すくいうと、ひとつのまとまりとしてインデックスされ、検索される情報のグルー プなのですが、これを形成しなくてはいけません。検索はこのコレクションに対し て行われます。次にこの「Verity Collections」の作成について解説します。 ■図4-2-1 ColdFusion管理者ページ

148


4章 探し物は何ですか?

Verity Cllectionsの作成 この章で紹介するサイト内、全文検索機能をColdFusionで実現させるために、 前述の通り、まず事前準備として「Verity Collections」を形成しなくてはいけま せん。 では、以下にその作成方法について説明します。 第3章 3-1のデータソース名の設定と同じように、ColdFusion管理者ページ (http://127.0.0.1/CFIDE/administrator/index.cfm)の左下部の[データソース] の項目の中に[Verityコレクション]というのがあると思います(図4-2-1)。これ をクリックすると、図4-2-2のような画面が登場しますね。このページのブランク を埋めなくてはいけません。

■図4-2-2 Verityコレクション

149


なんのことやらさっぱり、と思っているかもしれませんが、落ちついてゆっくり 進んでください。まず、 [名前]はCollectionsの名前で、任意の名前を付けるこ とができます。ここでは「testfiles」としましょう。Verityはこのcollectionの中に インデックス情報を保持するのです。そして次に[パス]ですが、Verityのデータ がどこにあるのかを示すものであり、実際のドキュメントがどのパスにあるのかを 示すものではありませんので注意してください。もちろん変更も可能ですが、デフ ォルト(C:¥CFusion¥verity¥collections)のままでかまいません。最後の[言 語]は文字通り使用する言語を選択します。これは、「English」を選択するのが 無難です。そして、[変更の送信]ボタンをクリックすると、Verity Collectionsが 形成されます(図4-2-3)。C:¥CFusion¥verity¥collections¥testfilesというフォ ルダができているのが確認できると思います。ここで設定した[パス]と[名前] の値は、この後登場する「CFINDEX」、 「CFSEARCH」などで利用しますので、 忘れないようにしてください。

■図4-2-3 Verityコレクションの作成が完了した画面

150


4章 探し物は何ですか?

索引付け コレクションを形成しただけではまだ空の枠組みに過ぎませんので、索引付けさ れたデータを持つコレクションを作成する必要があります。インデクシング(各ペ ージにどのような単語があるかを整理して、論理的なデータベースを構築すること を意味します)の作業を行わなくてはいけません。ColdFusion Studioでは、 「Verity Wizard」というものをサポートしており、これを利用すればインデクシン グは簡単なのですが、ここでは手動で行う方法について紹介しましょう。 インデクシングのためのファイル名をindex.cfmとします。 ■index.cfm <cfset <cfset <cfset <cfset <cfset

Cname = "testfiles"> Directory = "C:\Inetpub\wwwroot\cftest"> Ext = ".html, .txt, .htm"> Language = "English"> urlpath = "http://127.0.0.1/cftest/">

<cfindex collection="#Cname#" action="refresh" type="path" key="#Directory#" extensions="#Ext#" recurse="Yes" language="#Language#" urlpath="#urlpath#"> <html> <head> <title>インデクシング</title> </head> <body> <cfoutput> <h2>インデックスの更新</h2><br> <table border="1"> <tr>

151


<td><b>コレクション名:</b></td> <td>#Cname#</td> </tr> <tr> <td><b>ファイルタイプ:</b></td> <td>#Ext#</td> </tr> <tr> <td><b>URL パス:</b></td> <td>#urlpath#</td> </tr> </table> </cfoutput> </body> </html>

このソースコードの前提条件を以下に示します。 1. Collectionname → ColdFusion管理者ページで設定したコレクションの名前 (testfiles) 2. Directory → インデクシングするディレクトリ (C:¥Inetpub¥wwwroot¥cftest¥) 3. urlpath → インデクシングするディレクトリのURL (http://127.0.0.1/cftest/) このファイルを実行するとインデクシングは完了します。index.cfmは、インデ クシングの完了と同時に、図4-2-4のようにその内容を示す形にしています。

152


4章 探し物は何ですか?

■図4-2-4 index.cfmの結果

次のページの表4-2-1を参考にするとわかりやすいと思いますが、index.cfmでは 「CFINDEX」の「collection」属性にColdFusion管理者ページで設定した 「testfiles」というのをセットしていますね。 「extenstions」属性には「.html, .txt, .htm」を指定し、「type」属性は「path」になっていますから、指定したパス内 でhtml、htm、txtファイルについてインデックス作成をするということです。

153


タグCFINDEX このタグは、インデックス付きのデータを持つコレクションの形成に必要なタグ です。主な属性を以下にまとめます。 ■表4-2-1 CFINDEXの主な属性

属性

属性の意味

Collection(必須)

コレクションネームの指定(先にadmin設 定で作成したコレクションネームを使用)

Action

インデックス作成方法

Update

インデックス更新

Delete

KEYに指定したものを削除

Purge

データ削除と再形成への準備

Refresh

データ削除後再形成

optimize Type

最適化 どのインデックスを作成するか

file

ファイルのインデックス作成

path

指定したパス内のインデックス作成

custom

ColdFusion queryに依存したインデック ス作成

Key

どのディレクトリパスをドキュメントに加 えるか

Extention(type=path)

拡張子の定義で特定の拡張子ファイルだけ を検索する場合有効(*.は拡張子なしのフ ァイル)

Body (type=customなら必須) recurse

インデックスを作成するテキストまたは、 クエリ列名 サブフォルダにもインデクシングするか (通常Yes)

Title

コレクション名、Typeのクエリ列名など

(type=customなら必須)

154

language

言語指定

Urlpath(type=file,path)

ドキュメントのURLパス


4章 探し物は何ですか?

全文検索と検索結果の出力 さて次に、サーチする項目を入力するフォームを示し、それから検索結果を示 します。頭に入れておきたいのは、今index.cfmで形成したコレクションを検索す るためには、CFSEARCHというタグを使うということです。

■図4-2-5 primarysearch.cfmの表示結果

図4-2-5はサーチする単語を入力するボックスを示しています。これを処理する ファイルはこのファイル自身とし、primarysearch.cfmという名にしました。では、 この肝心なprimarysearch.cfmについて見てみましょう。

155


■primarysearch.cfm <cfset cname = "testfiles"> <html> <head> <title>検索結果</title> </head> <body> <cfoutput> <form action="#getfilefrompath(getcurrenttemplatepath())#" method="POST"> <h2>検索</h2> <font size="3">ファイル検索<br> 検索したいキーワードを入力してください。<br><br> </font> <input type="text" name="key"> <input type="submit" name="submit" value="検索"> </form> </cfoutput> <hr width="50%" align="left"> <cfif IsDefined("form.key")> <cfsearch name = "result" collection = "#cname#" criteria = "#form.key#" language = "English"> <cfif result.RecordCount is 0> <b>該当ファイルが見つかりません。</b> <cfelse> <table> <tr> <td><b>No.</b></td> <td><b>スコア</b></td> <td><b>ファイル</b></td> <td><b>ファイルタイトル</b></td> </tr>

156


4章 探し物は何ですか?

<cfoutput query="result" maxRows="30"> <tr> <td>#Evaluate(1 + CurrentRow - 1)#</td> <td>#Score# </td> <td> <cfset href=Replace(URL, " ", "%20", "ALL")> <a href="#href#">#GetFileFromPath(key)#</a> </td> <td>#Title# </td> </tr> </cfoutput> </table> </cfif> </cfif> </body> </html>

■図4-2-6 「花火」の検索結果

157


ここではインデクシング作業の前に、「C:¥Inetpub¥wwwroot¥cftest」ディレク トリの中に、「花火」という単語を含んだページとテキストファイルを置いておき ました(seafire.htm、japan-fireworks.htm、HanabiInfo.htm、fun.txt:この際 のファイル名には日本語は使用しない方が無難です)。よって、「花火」をキーワ ードに検索を試みましょう。その結果が157ページの図4-2-6です。 見事に「花火」というキーワードを含んだ文書が選択されています。リンクを クリックするとそれが確認できます。更にScoreまでもが自動的に計算されていま すね。すばらしい! このprimarysearch.cfmで初めて「CFSEARCH」というタグを使いましたの で、これについても説明しましょう。

タグCFSEARCH このタグは「Verity Collections」内でインデックス作成がすでに行われている データの検索に利用します。以下に主な属性についてまとめます。 name(必須)

サーチネーム(任意)

collection(必須)

コレクションネームの指定(先にadmin 設定で作成したコレクションネームを使 用)

criteria

検索のキーとなる言葉

maxrows

エントリの最大文字数

primarysearch.cfmの内容ですが、ここで、あれ?どこにも定義していない 「Title」とか「URL」とか「Score」などが出ているのはなぜ? という疑問を持 たれたでしょうか。これらは、結果のレコードセットとして定義されているもので す。その一覧は次のとおりです。

158


4章 探し物は何ですか?

Score

ドキュメントの信頼性

URL

CFINDEXで定義したURLPATH値

Title

CFINDEXで定義したTITLE属性

Key

CFINDEXタグ内で定義したKEY属性

Custom1,Custom2 CFINDEXでカスタムフィ−ルドに定義した値 Recordcount

レコードセットに返されたレコード数

Currentrow

現在行

Recordssearched

検索されたレコード数

Summary

自動要約内容

Columnlist

レコードセット内列名リスト

図4-2-7は検索ワードに「movie」と入力した場合の結果です。

■図4-2-7 「movie」の検索結果

159


先程の「花火」に関するファイル同様、Web上から映画「LEON」に関するペ ージをダウンロードし、検索対象となる「C:¥Inetpub¥wwwroot¥cftest」に保存 しておきました。そのページ中に「movie」という単語が含まれているであろうと いう推測のもとに検索を行った結果が図4-2-7です。ちゃんと検索されていますね。 これで検索もばっちりできる!とは思ったものの、『あーこれは何か見にくい! ファイルの内容がまるでわからない!』と感じてしまったでしょうか? 心配するこ とはありません。primarysearch.cfmでは試験的に結果を出力させましたので、見 やすいようにコードを書き換えましょう。ファイルの内容の出力も可能です。たと えば以下のsearch.cfmのように。

■search.cfm <cfset cname = "testfiles"> <html> <head> <title>検索</title> </head> <body> <cfoutput> <form action="#getfilefrompath(getcurrenttemplatepath())#" method="post"> <h2>検索</h2> <font size="3">ファイル検索<br> 検索したいキーワードを入力してください。<br><br></font> <input type="text" name="searchdo"> <input type="submit" name="submit" value="検索"> </form> </cfoutput> <hr width="50%" align="left"> <cfif IsDefined("form.searchdo")> <br><br> <font size="4"><b>検索結果:</b></font>

160


4章 探し物は何ですか?

<CFSEARCH NAME="pickup" COLLECTION="#cname#" CRITERIA="#form.searchdo#" Language="English" maxrows="50"> <cfoutput>#form.searchdo# について</cfoutput> <cfif pickup.RecordCount GT 0> <font color="#ff8040" size="4"> <cfoutput> #pickup.recordcount# 件見つかりました。<br><br> </cfoutput> </font> <cfoutput query="pickup"> <cfset href=Replace(URL, " ", "%20", "ALL")> <font size="3">#Evaluate(1 + CurrentRow - 1)#: <a href="#href#">#TITLE#</a></font><br> <font size="2"> #NumberFormat(Round(score * 100))#% #SpanExcluding(summary,'.')#... <br><br> </font> </cfoutput> <br> <cfelse> <cfoutput> 該当するものが見つかりません。 </cfoutput> </cfif> </cfif>

q

変更したのはqの部分だけですが、こうするとその出力結果は図4-2-8のように なります。これは先ほど同様Webから集めてきた映画「LEON」に関する資料を 検索した結果です。

161


■図4-2-8 「LEON」で検索した結果

関数10 Evaluate では、search.cfmの中で登場した関数Evaluateについて触れておきましょう。 これは文字通り評価関数で、式を評価します。具体的には次の通りです。 たとえば、次のようにコードを記述するとします。 <cfset value = 100> <cfset result = value * 8>

162

<cfoutput>#Evaluate(value * 8)#</cfoutput>

(1)

<cfoutput>#result#</cfoutput>

(2)

<cfoutput>#value# * 8</cfoutput>

(3)


4章 探し物は何ですか?

(1)では、value×8という値を式から直接出力させています。また、(2)で は、Resultという変数に式の結果を入れ、その値を出力させています。これら2つ の結果は同じです。つまり、Evaluate関数を利用すれば、変数に式の結果を代入 しなくても直接出力できるわけですね。ちなみに、(3)だと、800とは出力され ず、 「100*8」と表示されます。

関数11 GetFileFromPath ではもうひとつ、GetFileFromPath関数について触れておきましょう。 この関数は、絶対パスからファイル名を抽出する関数です。 GetFileFromPath(string) の形で利用します。

Verity Collections形成のもうひとつの手法 先ほどは、ColdFusion管理者ページでコレクションを形成する手法を紹介しま したが、実は「CFCOLLECTION」というタグを利用して同様のことを実現する ことも可能です。

<cfcollection Action="CREATE" collection="コレクション名(任意)" Path="パス名(C:¥CFusion¥Verity¥Collections)">

163


C

O

L

U

M

N

新機能! Verity K2 Server

Coldfusion Server 5には、Verity K2 Serverの

また、このモードを利用するには少々手間がか

OEM制限バージョンが組み込まれています。こ

かり、まず「C:¥CFusion¥Verity¥_nti40¥bin」

れは、クライアント−サーバー技術に基づき、従

で「k2server.ini」を編集しなくてはいけません。

来の検索機能よりパフォーマンスに優れた検索機

編集が完了したらK2 Serverを起動させ、更に、

能を持ち合わせているといわれています。本書で

ColdFusion管理者ページで「Verity Server」を

は、従来のVerity検索モードであるVDK(Verity

設定して利用することになります。設定方法の詳

Development Kit)モードを利用した例を示して

細については、ColdFusion Serverをインストー

おり、K2 Serverの機能を利用した例は示しては

ルしたときに、 一 緒 に詳 細 なマニュアルが

おりませんが、新たに組み込まれた機能としてご

「CFDOCS¥Advanced_Coldfusion_Administrati

紹介しておきます。 このモードをVDKモードに対し、K2モードとよ

on」というディレクトにインストールされていま すので、そちらを参照してください。

んでいます。スケーラブルな検索機能ですが、一 応、検索できるドキュメント数には以下のような

※K2 serverの使用をColdFusionで設定しなけれ

制限があります。

ば、自動的にVDKモードが適用されます。

◆ ColdFusion Enterprize:最大 250,000 ◆ ColdFusion Professional:最大 125,000

164


美味しいWebページのできあがり 実用的なWebページ作成 最終章はかなり歯ごたえのある内容です。まずは Cookieの紹介、そしてセキュアなページへのログ イン機能、更にはWebブラウザ上からのメール送 信などについて、これまでの応用編としてご紹介 します。ここまで読破すれば、ColdFusionを美味 しく味わえるでしょう。

5


5-1 第5章の事前準備〈メールサーバーの登録〉 ColdFusion管理者ページでメールサーバーを登録 本章では、ColdFusionを利用してWebページから直接メールの送信をする(お 客様への注文確認メールやサインアップ後のパスワード確認メールなど)という作 業をしますので、その際利用するメールサーバー(SMTPサーバー)を事前に登録 しておく必要があります。これも、第3章のODBCデータソースの作成と同様、 ColdFusion管理者ページにログインして登録します。図5-1-1の左側の項目の一 番上に[サーバの設定]という項目があります。その中に[メールまたはメールロ グ記録]という項目がありますので、これをクリックして、利用するSMTPサーバ ーのIPアドレスもしくはホスト名(mail.XXXX.XX.jpなど)を入力してください (図5-1-2)。そして[変更の送信]ボタンをクリックすれば登録完了です。 また、[サーバポート]はデフォルトの値が「25」となっています。特別な仕様 の場合は適切な値に変更してください。また、[接続タイムアウト]は、デフォル トの値が「60」となっています。信頼性如何により、これ以上の値にすることも 可能です。

サーバーの設定はタグでもできる サーバーの指定は「CFMAIL」タグのserver属性でも可能ですが、やっかいな面 もあるため、ColdFusion管理者ページでの設定をおすすめします。

166


5章 美味しいWebページのできあがり

■図5-1-1 ColdFusion管理者ページ

■図5-1-2 メールの設定

167


5-2 Cookie(クッキー)の発行〈Cookie変数〉 Cookieの発行 始めに、ColdFusionでのCookie発行のしくみとその確認について紹介しましょ う。まずは、あるサイトにアクセスする前に、入口で自分の名前と性を入れるペー ジを作成します。このフォームをwelcome.cfmとしましょう。このページでCookie を発行させ、目的のサイトにアクセスしたときに、発行されたCookieを表示して 確認することを考えましょう。フォームの例を図5-2-1に示します。 ■図5-2-1 welcome.cfmの表示結果

■welcome.cfm <cfif ParameterExists(cookie.times)> <cfcookie name="times" value="#evaluate(cookie.times+1)#" expires="7/17/2002"> <cfelse> <cfcookie name="times" value="1" expires="7/17/2002"> </cfif>

168

q


5章 美味しいWebページのできあがり

<html> <cfheader name="Expires" value="#now()#"> <head> <title>Cookie</title> </head> <body> <h1>音楽館を楽しむため</h1> <h4>まず、あなたの名前と性別を入力してください</h4> <form name="login" action="welcoming.cfm" method="post"> <table border="1"> <tr> <td align="right"><b>名前</b></td> <td> <input type="text" size="20" maxlength="50" name="name"> </td> </tr> <tr> <td align="right"><b>性別</b></td> <td> <input type="radio" name="sex" value="man">男性 <input type="radio" name="sex" value="woman">女性 </td> </tr> <tr> <td colspan="2"> <center><input type="submit" value="Go "></center> </td> </tr> </table> </form> </body> </html>

welcome.cfmのqで、まず「ParameterExists」という関数(172ページ 関数 12参照)を使い、Cookie変数「times」が存在するか否かを確認し、存在すれ ばその値に1を加え、存在しなければ、つまり初めてのアクセスだった場合は、そ

169


の値を1にセットします。「expires」という属性は、文字通りCookieの有効期限 を示します。ここでは、2002年の7月17日までとしています(基本的にはこの属 性はあまり使わないと思いますが、今回は実験のため使ってみました)。そして welcome.cfmでは、Cookieを発行した後のコードで図5-2-1のフォームを書いて いますね。そこで入力された値をwelcoming.cfmに引き継いでいます。では、 welcoming.cfmを見ていきましょう。 ■welcoming.cfm <html> <head> <title>ようこそ音楽館へ</title> </head> <body> <cfoutput> <h3>#Dateformat(now(),"YYYY 年 M月 D日")#</h3><br> <cfif form.sex EQ 'man'> <h1>#form.name# (男性) さん</h1> <cfelse> <h1>#form.name# (女性) さん</h1> </cfif> <br> <p> <h2>ようこそ音楽館へ</h2> <p> <cfif IsDefined("cookie.times")> <h3>ここにこられたのは <cfif cookie.times EQ '1'> 初めてですね。 <cfelse> #cookie.times# 回目ですね。 </cfif> </h3> </cfif> </cfoutput> </body> </html>

170

q


5章 美味しいWebページのできあがり

welcoming.cfmのqの部分で、このユーザーが何回welcome.cfmにアクセスし たのかを表示させています。これで初めてのアクセスのときは図5-2-2のように表示 され、2度目以降は図5-2-3のようにその回数が表示されればCookieの正常動作が 確認できます。 有効期限を2002年7月17日にセットしていますので、これを過ぎるとリセット されるのも確認できるはずです。日付がわかるように、第2章の2-1で学んだ日付 表示関数を使って出力させています。

■図5-2-2 初めてアクセスしたとき

171


■図5-2-3 2回目にアクセスしたとき

関数12 ParameterExists welcome.cfmで使ったParameterExistsについて説明します。 ParameterExists(parameter) という形で利用し、指定されたパラメータが現在のテンプレートに渡されているか、 あるいは現在のテンプレートの実行時にすでに作成されている場合は「TRUE」を 返し、そうでない場合は「FALSE」を返します。しかしもともとこの関数は、 ColdFusionの旧バージョンで使われていたものですので、先に紹介したIsDefined (87ページ 関数4参照)を利用する方がいいでしょう。ここでは紹介のためにこの 関数を使ってみました。

172


5-3 セキュアなサイトへのログイン〈ログイン認証〉 会員限定サイトに入るためのログイン認証 では、今まで学んできたことをベースに、セキュアなサイトに入るとき利用する ログイン認証をColdFusionで行う場合、どのような手法があるのかを見ていきま しょう。 まずは5-2と同じように、ごく簡単なログイン画面を作ってみましょう(図5-31)。このプログラム名をprelog.cfmとします。

■図5-3-1 prelog.cfmの表示結果

また、prelog.cfmで登場するsampleデータベースのテーブル「users」は表53-1の通りです。これはユーザーIDとパスワードの情報を管理しているテーブルで す。ここは少し難しいエリアなので心してください。

173


■表5-3-1 usersテーブルのフィールド

フィールド名

データ型とプロパティ

secureID

オートナンバー型

userID

テキスト型、主キー

fname

テキスト型

lname

テキスト型

email

テキスト型

■prelog.cfm <cfif IsDefined("url.badlogin")> <center>再試行願います。認証に失敗しました。</center> </cfif> <html> <head> <title>メンバーログイン</title> </head> <body bgcolor="#818EED" text="White"> <center> <h3><font size="5" color="#FFFF00"> メンバーログイン </font></h3> <br><br> <table border="3" width="520"> <tr> <td bordercolor="#818EED" width="30%"> <B><font color="#0000ff"> 会員の方は<br>ここから</font></B></td> <td width="68%"></td> <td width="2%"></td> </tr> <tr> <td></td>

174

q


5章 美味しいWebページのできあがり

<td> <form action="dologin.cfm" method="post" target="_top"> <br> <table border="0" bordercolor="0088ff"> <tr> <td><b>ユーザーID</b></td> <td align="left" colspan="2"> <input type="text" size="20" maxlength="50" name="userID"> </td> </tr>

w

<tr> <td><b>パスワード</b></td> <td> <input type="Password" name="password"> </td> <td> <input type="Submit" value="ログイン"> </td> </tr> </table> </form> </td> <td></td> </tr> </table> </center> </body> </html>

175


さてどうでしょう。わかりやすいよう、下から見ていきましょう。まず、wの部 分、ここは簡単ですね。ここは図5-2-1と同じように入力用のフォームを作成して いる部分です。まだqのコードについては解説していませんが、一度[ログイン] ボタンをクリックしたとし、dologin.cfmの内容を見てから、また戻ってきましょ う。

■dologin.cfm <cfquery name="validateUser" datasource="sample"> SELECT * FROM users WHERE users.userID = '#form.userID#' AND users.Password = '#form.Password#' </cfquery>

q

<cfif validateUser.secureID IS NOT ""> <!--<cflock scope="session" timeout="10" type="EXCLUSIVE"> <cfset session.secureID = validateUser.secureID> ---> <cfcookie name="uname" value="#validateUser.userID#"> <!--</cflock> ---> <meta http-equiv="refresh" content="0; url=securezone/logined.cfm"> </cfif> <cfif validateUser.recordcount EQ 0> <meta http-equiv="refresh" content="0; url=prelog.cfm?badLogin=yes"> </cfif>

176

w

e


5章 美味しいWebページのできあがり

d o l o g i n . c f m については上 から順 番 に見 ていきましょう。 qの部 分 の 「CFQUERY」には十分に慣れたと思いますが、ここは、prelog.cfmで渡されたフ ォーム変数がデータベーステーブル「users」と一致する部分の情報をすべてセレ クトするように、というクエリです。わかりやすく言いかえると、入力されたユー ザーIDとパスワードをデータベーステーブルと照合し、一致したユーザーの情報を セレクトせよということです。そして次にwの部分。とりあえず、コメント文(<!----->)は無視してください。ここはあとの作業で利用する箇所です。注目したいの は、ここでユーザー名についてのCookieを発行しているところです。これは前のセ クションのおさらいですね。この場合、Cookie nameをunameとしています。 そしてなかなかたどりつけなかった認証完了後のページ、logined.cfm(次頁参 照)にジャンプするわけです。MetaタグはHTMLで勉強済みですね。 最後の部分(e)については、入力されたユーザーID、パスワードとデータベ ーステーブルの照合で合致するデータが無かった場合、つまり不正ユーザーのログ インチャレンジだった場合、そのrecordcountは0となりますので、ここで前の prelog.cfmに戻れという命令を書きます。 さて、それでは、prelog.cfmに戻ってみましょう。

<cfif IsDefined("url.badlogin")> <center>再試行願います。認証に失敗しました。</center> </cfif>

先ほど説明を飛ばしたprelog.cfmの最上部では、badloginでprelog.cfmに戻さ れた場合、<cfif IsDefined("URL.badlogin")>で認証されなかったよ! というメッ セージを出し、もう一度ユーザーIDとパスワードを入力するようフォームを表示し てあげるのです(図5-3-2参照)。 うまくログインできた場合は、図5-3-3のlogined.cfmに入れるわけです。

177


■図5-3-2 ログイン認証に失敗した画面

CFLOCATIONを使わない理由 dologin.cfmの中では、ジャンプ指定で「CFLOCATION」を利用せずに、 HTMLのmetaタグを利用していますね。何故だかわかりましたか? わからない方 は、もう一度、106ページの第3章の3-6 CFLOCATIONの記事を参考にしてくだ さい。

178


5章 美味しいWebページのできあがり

■logined.cfm(securezoneディレクトリ) <html> <head> <title>認証済み</title> </head> <body> <h1>おめでとうございます</h1><br> <cfif IsDefined("cookie.uname")> <cfoutput> <h3> あなた(#cookie.uname#) は正規ユーザーとして認証されました。 </h3><br> </cfoutput> </cfif> </body> </html>

■図5-3-3 securezone/logined.cfmの表示結果

179


logined.cfmは「securezone」というディレクトリを作成し、その中に保存し ます。図5-3-3を見ると、ちゃんとCookieが発行されていることも確認できますね。 さて、これで安心してはいけません。ちゃんと不正ユーザーがログインできない ことも確かめておきましょう。図5-3-4は不正ユーザーである「devil」さんがログ インにチャレンジしている様子を示します。その結果が図5-3-5です。間違いなく 認証で引っ掛かっていますね。

■図5-3-4 不正なログインチャレンジ

180


5章 美味しいWebページのできあがり

■図5-3-5 不正なログインチャレンジの結果

ここまでできれば、データベースと連携させて、正確なユーザーIDとパスワード を入力しなければ、目的のページにたどりつけないと思うでしょう。しかしここで 安心するのはまだ早いです。だって、一度ログインできたユーザーが席を立ってい る隙に、悪者がそのURLを盗んで自分のパソコンから直接そのURLにアクセスす ればログインできてしまうでしょう。これは危険危険。ただし、セキュリティの強 化については上をみればきりがないので、これを防ぐ手法を説明するまでにとどめ ます。 話を戻して、実際どのようにするとこれが防げるのか? まずは、先ほどの dologin.cfmを見てください。まずこのファイルのコメント文をはずします。何を 有効にしたかというと、セッション変数にユーザのsecureIDをセットする作業を有 効にしました。またセッションスコープをロックしていますが、これを有効にする ために、dologin.cfmと同じディレクトリに、application.cfmというファイルを準 備します。そして実際のセキュアなサイトは、「securezone」というディレクトリ

181


の中にありますので、このディレクトリにもapplication.cfmを置き、セッション変 数、クッキーなどが存在するか否かをチェックします。存在しない場合は、不正 とみなしてひとつ上のディレクトリにあるログインフォームに戻りなさいといってい るわけです。ちなみに、application.cfmというファイルがある場合は、それがその ディレクトリ内で一番初めに実行されます。よって、logined.cfmを実行しようと しても、先にapplication.cfmで制御されてしまうわけです。

■application.cfm(securezoneディレクトリ) <cfapplication name="secure" clientmanagement="yes" sessionmanagement="yes"> <cfif not IsDefined("session.secureID") OR not IsDefined("Cookie.uname")> <cflocation url="../prelog.cfm?badLogin=yes"> </cfif>

■application.cfm <cfapplication name="secure" clientmanagement="yes" sessionmanagement="Yes">

これらのファイルを設置したあとで、Webブラウザを再起動してから直接 logined.cfmのURLを入力してみてください。入れないはずです。Badloginとして 戻されるでしょう。

182


5章 美味しいWebページのできあがり

タグ CFAPPLICATION このタグは、「application.cfm」という名のファイル中でセッション変数を有効 にしたり、クライアント変数を有効にしたりする際に使われます。主な属性は以下 の通りです。

CFAPPLICATIONの属性 name

必須指定。アプリケーションの名を付ける。

sessionmanagement セッション変数を有効にするためには、Yesに する。デフォルトはNo。 clientmanagement クライアント変数を有効にするために、Yesに する。デフォルトはNo。

183


5-4 Webページからメールを送る〈メール送信〉 Web Mailの実現 今度は、よく見かけるWebページからのメールの送信について紹介しましょう。 おっとその前に基本的な事柄について。 一般にE-mailを送信する際には、SMTP(Simple Mail Transfer Protocol)サ ーバーというものを利用しています。ColdFusionの中にこれが含まれていると思 ったらそれは大きな間違いです。ですから、メールの送信もしてしまおうという場 合は、まずSMTPサーバーを準備してください。そして、ColdFusion管理者ペー ジでそれらの情報を登録するわけですが、これは本章の事前準備で説明していま すので、そちらをもう一度見直してくださいね。もし、SMTPサーバーを自前で準 備することが不可能な環境にある方の場合、他の利用許可を得ているSMTPサー バーを指定してください。 ■図5-4-1 premail.cfm

184


5章 美味しいWebページのできあがり

では、まず、送信先相手のメールアドレスなどを入力するフォームから見ていき ましょう。なんら特別なことはない、普通のフォームです。

■premail.cfm <html> <head> <title>E-mail送信</title> </head> <body> <cfif IsDefined("url.lack")> <p> 空欄がありました。全部埋めて再試行してください。<br> </p> </cfif> <h1>E-mailを送る</h1> <form action="mail.cfm" method="POST"> <p> <h3>あなたの名前:</h3> <input type="text" name="name" size="30" maxlength="30"> <br> <h3>送信先メールアドレス:</h3> <input type="text" name="email" size="30" maxlength="30"> <br> <h3>あなたのメールアドレス:</h3> <input type="text" name="remail" size="30" maxlength="30"> <br> <h3>メールタイトル</h3> <input type="text" size="20" maxlength="50" name="subject"> <h3>メッセージ:</h3> <textarea name="message" Rows="6" cols="50">

185


</textarea> <br><br> <input type="submit" value="送信"> <input type="reset" value="リセット"> </form> </body> </html>

premail.cfmで入力された自分の名前、送信先E-mailアドレス、送信元E-mail アドレス、メッセージがどのように処理されるのか、次のmail.cfmで見てみましょ う。

■mail.cfm <cfif (form.email IS NOT "") AND (form.remail IS NOT "") AND (form.subject IS NOT "") AND (form.message IS NOT "")> <html> <head> <title>E-mail送信</title> </head> <body> <CFMAIL TO="#form.email#" FROM="#form.remail#" SUBJECT="#form.subject#" Type="HTML"> #form.message# <br><br> Reply to: <a href="mailto:#form.remail#">#form.remail#</a> <br> </CFMAIL>

186


5章 美味しいWebページのできあがり

メッセージを送信しました。 </body> </html> <cfelse> <cflocation url="premail.cfm?lack=yes"> </cfif>

このファイルを実行すると、指定した宛先に正確にメールが届きます。入力し た通りに送られているのが確認できるでしょう(図5-4-2、図5-4-3) 。 ■図5-4-2 メッセージを入力する

187


■図5-4-3 mail.cfmの表示結果

CFMAILタグの中でフォームで入力した値を引き継いでいますね。

CFMAILとメール形式 CFMAILの属性に、 「server」というものと「type」というものがあります。 まず、serverについてですが、これは基本的には必須属性で、メッセージの送信 に使うSMTPサーバーのアドレスを指定します。サーバーが指定されていない場 合は、ColdFusion管理者ページで指定されているサーバー名が使われます。 また、type属性はオプションです。現在この属性に有効な値は"HTML"だけとな っています。この機能は、HTML(Netscape 2.0以降のメールソフト)を使用 できるメールソフトにメッセージを送信する場合に限って使うことができます。 たとえばmail.cfmでは「Type="HTML"」としてその中のメッセージフォームで HTMLのタグである<br>や<a href=….></a>を利用していますが、送信先のメ ールソフトがHTMLに対応していないものであれば、そのままテキストで (メッセージ内容)<br><br> Reply to: <a href="mailto:(メールアドレス)"> (メールアドレス)</a><br> と表示されたメールが送信されますので注意してください。

188


5章 美味しいWebページのできあがり

では、次にこれを応用するべく、次のようなことを考えてみましょう。 よく、Webサーフィンをしていると、会員専用ページなどにお目にかかり、そこ でサインアップを求められたことはありませんか? ここではそのページを提供する 側に立って、それらと同じサインアップフォームを作ってみましょう。これが CFMAILとどう関係するのかというと、サインアップしたあとにパスワードの確認 メールが自動的に届くようにするのです。これをより実用的な例としてみるために、 すでにユーザーIDをもっている人はそのままログインして目的のサイトにアクセス し、新規の人は上で述べたようにサインアップするというストーリーで考えてみま しょう。

CFMAILの属性 CFMAIL Cc

カーボンコピー

From

送信元アドレス

Subject

タイトル

To

送信先アドレス

Type

メッセージタイプ

CFMAILタグでよく使う属性をあげておきました。E-mailでおなじみのものばか りですね。普通のE-mail送受信で通常使わないのは、メッセージタイプくらいでし ょうか。

Prefixについて 変数にはprefixを付けることができます。mail.cfmを例にとると、「form.email」 などの表現がそれに当たります。これは、スコープの異なる同一名変数などの区 別に役立ちます。

189


5-5 ちょっと本格的なWebページ〈応用編〉 会員限定ページへのログインとサインアップの組み合わせ 今まで学んできたことをここでまとめて、より実用的な利用法を考えてみましょ う。ストーリーとしては、まず会員限定ページ(音楽館)へアクセスするためのロ グイン画面を作成します。そしてこれには、新規会員のためにサインアップする項 目も準備するのです。すでに会員になっている人のログインについては前に説明し た通りです。 具体的なソースコードはuserlogin.cfmで、参照するデータベーステーブルは usersとし、以前のものと同じものを利用しましょう。

■userlogin.cfm <cfif IsDefined("url.badlogin")> <center>再試行願います。認証に失敗しました。</center> </cfif> <html> <cfheader name="Expires" value="#now()#"> <head> <title>メンバーログイン</title> </head> <body bgcolor="#818EED" text="White"> <center> <h3><font size="5" color="#FFFF00"> メンバーログイン </font></h3> <font size="2" color="#ffffff"> 新しいミュージック情報はログインしてからご覧ください。<br> まだユーザー登録をしていない方は、ここからサインアップしてください。<br> クールな情報が満載だよ!! </font> <br><br> <table border="3" width="520"> <tr> <td bordercolor="#818EED" width="30%"> <B><font color="#0000ff">

190


5章 美味しいWebページのできあがり

会員の方は<br>ここから </font></B> </td> <td width="68%"></td> <td width="2%"></td> </tr> <tr> <td></td> <td> <form action="userdologin.cfm" method="post" target="_top"> <br> <table border="0" bordercolor="0088ff"> <tr> <td><b>ユーザーID</b></td> <td align="left" colspan="2"> <input type="text" size="20" maxlength="50" name="name"> </td> </tr> <tr> <td><b>パスワード</b></td> <td> <input type="Password" name="password"> </td> <td> <input type="Submit" value="ログイン"> </td> </tr> </table> </form> </td> <td></td> </tr> <tr> <td bordercolor="#818EED" width="30%"> <b><font color="#0000ff"> 新規ユーザー登録を<br>する方 </font></b>

191


</td> <td width="68%"></td> <td width="2%"></td> </tr> <tr> <td></td> <td valign="middle" align="left" bordercolor="#818EED"> <form action="sign_up.cfm" method="post" target="_top"> <input type="Submit" value="サインアップ"> </form> </td> <td></td> </tr> </table>

q

</center> </body> </html>

では、新規ユーザーがこのサイトにアクセスするところから考えていきましょう。 新規ユーザーはサインアップしなくてはいけません。これがqにあたります。この 処理はsign_up.cfmに渡されます。

■sign_up.cfm <html> <head> <title>サインアップフォーム</title> </head> <body bgcolor="#818EED" text="White"> <center> <cfif IsDefined("url.dup")> <p> <font size="3" color="#FFff00">

192

q


5章 美味しいWebページのできあがり

■図5-5-1 userlogin.cfmの表示結果

<b>申し訳ございません。<br> そのユーザーIDはすでに他の会員に使われております。<br> もう一度別のIDで登録してみてください。</b></font><br> <p> </cfif> <cfif IsDefined("url.lack")> <p> <font size="3" color="#FFff00"> <b>空欄があります。すべて埋めてください。</b> </font><br> <p> </cfif>

<h3><font size="5" color="#FFFF00"> サインアップフォーム </font></h3> <font size="2" color="#ffffff">

w

e

193


会員になって情報をGETしよう </font> <form action="register.cfm" method="post" target="center"> <table border="0"> <tr> <td><b>姓:</b></td> <td> <input type="text" size="20" maxlength="50" name="lname"> </td> </tr> <tr> <td><b>名:</b></td> <td> <input type="text" size="20" maxlength="50" name="fname"> </td> </tr> <tr> <td><b>ユーザーID:</b></td> <td> <input type="text" size="20" maxlength="50" name="userID"> </td> </tr> <tr> <td><b>E-mail:</b></td> <td> <input type="text" size="20" maxlength="50" name="email"> </td> </tr> <tr> <td><b>パスワード:</b></td> <td> <input type="password" size="20" maxlength="50" name="password">

194


5章 美味しいWebページのできあがり

</td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td colspan="2" align="middle"> <input type="Submit" value="登録"> </td> </tr> </table> </form> </center> </body> </html> ■図5-5-2 sign_up.cfmの表示結果

195


q、wの部分を除いて考えれば、つまりe以降については、ごく単純なフォー ムを使ってアクセスしてきたユーザーに必要事項を入力してもらう画面です。ここ で入力した情報をregister.cfmに引き継いで処理を行うわけですが、ここでもやは りユーザーIDとパスワードを照合するわけですので、「userID」と「password」 などのフィールドを含んだデータベーステーブルを準備しなくてはいけませんね。こ れは以前、ログイン認証のときに利用したものと同じテーブルusersを利用しまし ょう。 そして実際にsign_up.cfmで入力した値をregister.cfmに引き継ぐ前に、少々 応用的な部分となるq、wについて説明します。 qでは、すでに登録されているuserIDをサインアップユーザーが希望し、入力 してきた場合の処理をします。wでは、入力フォーム中に空欄があった場合の処 理をします。q、wともに、IsDefined関数を利用していますね。ここで、URL.xx というURL変数が出てきますが、これは、たとえばqなら、このファイルのdupと いう変数がyesの値を持つならば、つまりsign_up.cfm?dup=yesならばそれ以降 の処理をせよということを示しているのです。wは同様に、sign_up.cfm?lack=yes ならばという意味ですね。これらの変数定義をどのように行っているのかは、処理 を引き継ぐregister.cfmの中で説明します。

URL変数 「なんとか変数」なんていう言葉を聞くと、蕁麻疹がでちゃうという人はいるでし ょうか? とっつきにくい言葉かもしれませんので、ちょっと解説しておきます。 リンク先へ渡すデータ変数、とでも言えばいいでしょうか? 具体的に上の例以外 に第3章の3-5に出てきたものを例にとりましょう。 Update_movie.cfm?movieID=16 この意味は、movieIDという変数が16の値をとりupdate_movie.cfmに渡され ることを意味します。書式としては、渡される先のURLの後ろに「?」を加え、 変数名=その値という形で表現してやります。複数個の変数を同時に渡す場合 はそれらを「&」でつなぎます。

196


5章 美味しいWebページのできあがり

■register.cfm <cfif (form.email IS NOT "") AND (form.userID IS NOT "") AND (form.password IS NOT "")>

q

<cfquery datasource="sample" name="get_uname"> SELECT userID FROM users WHERE userID = '#form.userID#' </cfquery>

w

<cfif get_uname.recordcount NEQ 0> <cflocation url="./sign_up.cfm?dup=yes">

e

<cfelse>

r

<cfinsert datasource="sample" tablename="Users"> <CFMAIL TO="#form.email#" FROM="webmaster@example.com" SUBJECT="会員登録ありがとうございます">

t

あなたのパスワードは#form.password#です。 忘れないようにしてください。 </cfmail>

y

<html> <head> <title>登録完了</title> </head> <body bgcolor="#818EED" text="White"> <center> <p> <h3>会員登録ありがとうございました。</h3><br> <table border="0"> <tr> <td> <cfoutput> あなたの名前は #form.lname# #form.fname#. </cfoutput>

197


</td> </tr> <tr> <td> <cfoutput> あなたのEmailアドレスは #form.email#. </cfoutput><br> </td> </tr> <tr> <td> ユーザーIDは <cfoutput>[#form.userID#]</cfoutput> <br> </td> </tr> <tr> <td align="right">で登録いたしました。</td> </tr> </table> <br><br> <hr> <font size="2"></font> 後ほど、登録いただいたEmailアドレス宛にパスワード情報のメールが 送付されますのでご確認ください。</font> <p> <a href="./userlogin.cfm" target="_top">ログインページへ</a> </center> </body> </html> </cfif> <cfelse> <cflocation url="sign_up.cfm?lack=yes"> </cfif>

198

u


5章 美味しいWebページのできあがり

■図5-5-3 register.cfmの表示結果

基本処理の部分はrのCFELSE以降の部分となります。それより上の部分は応 用部分なので最後に説明します。tでさっそく先ほど学んだばかりのCFMAILを 利用して、サインアップユーザーにフォームで入力された値を元に入力パスワード 情報のメールを送信していますね。これと共にyのHTMLの部分はサインアップ完 了の画面(図5-5-3)を表しており、これを表示させるようなしくみになっている のです。 では、応用部について見てみましょうか。

199


さて、ではqから順にみていきましょう。ここでは、サインアップユーザーの「ユ ーザーID」「Emailアドレス」「パスワード」入力に空欄がないという条件を付け、 もしも空欄がある場合は、このソースコードの最下部(u)CFELSEにある CFLOCATIONにて、もう一度「lack」というURL変数を持ってsign_up.cfmに 飛ぶように命令しています。これがsign_up.cfmに飛ぶと、そのファイル中にURL 変数「lack」が存在する場合という定義に従い、そのために準備されたコメント を表示することになります。これが、先ほど説明を飛ばしたsign_up.cfmのwの部 分<cfif IsDefined("url.lack")>に相当するわけです。 では、次はwです。ちょっと疲れてきたかもしれませんが頑張ってください。こ こでは入力されたuserIDと既存のデータベースを照合し、その結果、その名前が 存在しなかった場合、つまりユーザー希望のuserIDに重複がない場合、rの CFELSE以下のコードに従い、そうではなく、つまりuserIDが使われていた場合 は、eでsign_up.cfmにURL変数「dup」を持って飛ぶよう命令しています。こ こでも、入力を空欄にした場合と同様そのためのメッセージを準備し、再度別の userIDを利用してサインアップするようメッセージを表示します(図5-5-4参照)。 これは、sign_up.cfmにおけるqの部分、つまり<cfif IsDefined("url.dup")>に相 当する部分です。

200


5章 美味しいWebページのできあがり

■図5-5-4 userIDが重複した場合

大体このような形でサインアップフォームを仕上げることができるでしょう。 サインアップ終了後、今度は本来の目的である音楽館へログインしてサイトを 楽しむという流れを考えてみましょう。 図5-5-1に戻り先程登録したユーザーIDとパスワードでログインし、音楽館へ入 ります。 以 下 は、 u s e r l o g i n . c f m の既 存 ユーザーの処 理 の部 分 で処 理 を userdologin.cfmに引き継いでいるところです。これは、5-3のdologin.cfmとほと んど違いはありませんが、念のため次のページに載せておきましょう。

201


■userdologin.cfm <cfquery name="validateUser" datasource="sample"> SELECT * From users Where users.userID = '#form.name#' AND users.Password = '#form.Password#' </cfquery> <cfif validateUser.secureID is NOT ""> <cflock scope="session" timeout="90" type="Exclusive"> <cfset session.secureID = validateUser.secureID> <cfcookie name="uname" value="#validateUser.userID#"> <cfcookie name="email" value="#validateUser.email#"> </cflock> <meta http-equiv="refresh" content="0;url=./music/musicplace.cfm"> </cfif> <cfif validateUser.recordcount EQ 0> <meta http-equiv="refresh" content="0;url=userlogin.cfm?badlogin=yes"> </cfif>

q

w

ポイントは、正規に認証されたらmusic/musicplace.cfmへ行きなさい。もしも 認証されなければ、URL変数「badlogin」を持ってuserlogin.cfmに戻りなさい、 というところですね。これがそれぞれqとwに相当します。これは、ほとんど5-3 のdologin.cfmと同じですので、わからなくなった人は戻ってみてください。 また、ここで肝心なことを覚えてますか?はい。そうです。application.cfmを 置かなくてはいけませんね。5-3で説明したような不正をチェックするものを必ず musicディレクトリにも置いてください。 そうして、無事ログインできた際のmusicplace.cfmを以下に紹介しておきまし ょう。またここでは、このサイト会員の皆様からの質問をWebからのメールで受け 付けるというしくみを持たせました。機能の部分はこれまで紹介したものですので

202


5章 美味しいWebページのできあがり

説明は省きますが、実用できるのではないでしょうか? また本書では解説しませ んが、これまで学んできたことを元に会員限定の掲示板を作ってみてもおもしろい かもしれませんね。

■musicplace.cfm <html> <head> <title>ようこそ音楽館へ</title> </head> <body bgcolor="#818EED" text="White"> <center> <cfoutput> #cookie.uname# さんがログインしています</cfoutput><br> <p> <h1><font color="#0000ff"> <b>音楽館をお楽しみください。</b> </font></h1> </p>

q

<p><font color="#ff0000"> <b>過去のレコード大賞情報</b> </font></p> <table border="1"> <tr> <td> <table border="0"> <tr> <td>1. 黒い花びら</td> </tr> <tr> <td>2. 誰よりも君を愛す</td> </tr> <tr> <td>3. 君恋し</td> </tr> <tr>

203


<td>4. </tr> <tr> <td>5. </tr> <tr> <td>6. </tr> <tr> <td>7. </tr> </table> </td> </tr> </table>

いつでも夢を</td>

こんにちは赤ちゃん</td>

愛と死をみつめて</td>

柔</td>

<hr> <font color="#000000"> <P>ご質問はこちらのフォームから送信してください。</P> </font><br> <form action="posted.cfm" method="post" target="_top">

w

<table border="0"> <tr> <td><font color="#000000">ご質問タイトル:</font></td> <td> <input type="text" size="20" maxlength="50" name="subject"> </td> </tr> <tr> <td><font color="#000000">ご質問内容:</font></td> <td><textarea name="question" Rows="7" cols="40"> </textarea></td> </tr> <input type="hidden" name="name" value="<cfoutput>#cookie.uname#</cfoutput>"> <input type="hidden" name="email" value="<cfoutput>#cookie.email#</cfoutput>">

204

e


5章 美味しいWebページのできあがり

<tr> <td> </td> <td> </td> </tr> <tr> <td colspan="2" align="middle"> <input type="Submit" value="送信"> </td> </tr> </table> </form> </center> </body> </html>

ここでのポイントは、5-2で学んだCookieをqで表示させ、wで質問投稿の posted.cfmに渡している部分ですね。これがどのような役割を果たすかは、以下 のposted.cfmで説明しましょう。 ■posted.cfm <cfif form.question IS NOT ""> <CFMAIL TO="mio@xxx.odn.ne.jp" FROM="#cookie.email#" SUBJECT="#form.subject#"> 内容: #form.question# </cfmail> <html> <head> <title>ご質問内容</title> </head>

205


<body bgcolor="#818EED" text="White"> <center> <font size="5" color="Red"></font><br><br> 下記の質問内容で担当にメールが送信されました。<br> <table border="0" width="700"> <tr> <td align="right"> <cfoutput>#cookie.uname# さん</cfoutput><br> <cfoutput>#cookie.email# </cfoutput> </td> </tr> </table> <hr> <font color="#000000"> <p><cfoutput>#form.question#</cfoutput></p> </font> <p><a href="musicplace.cfm">戻る</a></p> </center> </body> </html> <cfelse> 質問が入力されていません。もう一度入力してください。 </cfif>

206


5章 美味しいWebページのできあがり

■図5-5-5 posted.cfmの表示結果

ここでは、投稿した質問内容を画面上に表示させ、ユーザーに確認をとってい ます。ポイントはeに示したcookieの部分で、いちいち、自分のユーザーIDと emailアドレスを入力しなくても、一度ログインしたユーザーについては、ちゃん とそのユーザー名、emailアドレス情報を保有しており、自動的にどのemailアド レスをもつ誰々さんからのメールは下記内容ですということでちゃんと送信される のです。結構便利に使えそうだと思いませんか? 掲示板などでをこのサイトで作る際もこのようにcookieを有効にしておけば、書 き込みの際にいちいち自分のハンドルネームやemailアドレスを入力しなくても自 動的に反映されるのです。ぜひ使ってみてください。

207


5-6 ちょっとお遊び〈自動ログイン〉 自動ログインについて じゃぁ少し遊び感覚で、自動ログインなんて機能もColdFusionで実現できるか どうか考えてみましょう。 1) prelog.cfmのフォームの最後に自動ログインを希望するかどうかのチェックボ ックスを用意してみます。 たとえば、以下のような感じです。

<input type="checkbox" name="autologin"> <font size="1"> 自動ログイン機能を有効にしたい場合はここをチェックしてください。 <p> <b>注意!!</b>ここをチェックするとあなたのPCにアクセスできる人は、このセキュ アなサイトにもアクセス可能になってしまうことを意味します。 </font>

では、このチェックをどう処理するかというのは、dologin.cfmの中での処理と いうことになるのはもうわかっているでしょう。そう、もしチェックされていたら、 というコードを書かなくちゃいけないですね。これはたとえば、以下のような感じ にして、wのセッション変数を定義するところの下あたりにいれておけばいいでし ょう。

<cfif IsDefined("form.autoLogin")> <cfcookie name="userID" value="#validateUser.secureID#"> </cfif>

208


5章 美味しいWebページのできあがり

ここまでで1回目のアクセス時の処理はできたけど、肝心な2度目のアクセス時 に自動ログインができるようにしなくてはなりませんね。そうするにはもう一度、 prelog.cfmに戻って、頭の部分にこんなのを付け加えてみてはどうでしょう?

<cfif IsDefined("cookie.userID")> <cfquery datasource="sample" name="validate"> SELECT secureID FROM Users WHERE Users.secureID = #cookie.userID# </cfquery> <cfif IsDefined("validate.secureID")> <cflock scope="session" timeout="30" type="EXCLUSIVE"> <cfset session.secureID = validate.secureID> </cflock> <cflocation url="securezone/logined.cfm"> </cfif> </cfif>

これをまとめると以下のようなファイルができあがり、自動ログインの確認もで きますね。これはセキュリティを考えるとあまりよくないものなのかとも思います が、ちょっと遊び感覚で紹介してみました。 これらのファイル名をprelogauto.cfmとdologinauto.cfmとしましょう。

209


■prelogauto.cfm <cfif IsDefined("cookie.userID")> <cfquery datasource="sample" name="validate"> SELECT secureID FROM users WHERE users.secureID = #cookie.userID# </cfquery> <cfif IsDefined("validate.secureID")> <cflock scope="session" timeout="30" type="EXCLUSIVE"> <cfset session.secureID = validate.secureID> </cflock> <cflocation url="securezone/logined.cfm"> </cfif> </cfif>

<cfif IsDefined("url.badlogin")> <center>再試行願います。認証に失敗しました。</center> </cfif> <html> <cfheader name="Expires" value="#now()#"> <head> <title>メンバーログイン</title> </head> <body bgcolor="#818EED" text="White"> <center> <h3><font size="5" color="#FFFF00">メンバーログイン</font></h3> <br><br> <table border="3" width="520"> <tr> <td bordercolor="#818EED" width="30%"> <B><font color="#0000ff"> 会員の方は<br>ここから </font></B> </td> <td width="68%"></td> <td width="2%"></td>

210


5章 美味しいWebページのできあがり

</tr> <tr> <td></td> <td> <form action="dologinauto.cfm" method="post" target="_top"> <br> <table border="0" bordercolor="0088ff"> <tr> <td><b>ユーザーID</b></td> <td align="left" colspan="2"> <input type="text" size="20" maxlength="50" name="userID"> </td> </tr> <tr> <td><b>パスワード</b></td> <td><input type="Password" name="password"></td> <td><input type="Submit" value="ログイン"></td> </tr> </table> <input type="checkbox" name="autologin"> <font size="1"> 自動ログイン機能を有効にしたい場合はここをチェックしてください。 <p> <b>注意!!</b>ここをチェックするとあなたのPCにアクセスできる人は、こ のセキュアなサイトにもアクセス可能になってしまうことを意味します。 </font> </form> </td> <td></td> </tr> </table> </center> </body> </html>

211


â– dologinauto.cfm <cfquery name="validateUser" datasource="sample"> SELECT * FROM users WHERE users.userID = '#form.userID#' AND users.Password = '#form.Password#' </cfquery> <cfif validateUser.secureID IS NOT ""> <cflock scope="session" timeout="90" type="EXCLUSIVE"> <cfset session.secureID = validateUser.secureID> <cfcookie name="uname" value="#validateUser.userID#"> </cflock> <cfif IsDefined("form.autoLogin")> <cfcookie name="userID" value="#validateUser.secureID#"> </cfif> <meta http-equiv="refresh" content="0; url=securezone/logined.cfm"> </cfif> <cfif validateUser.recordcount EQ 0> <meta http-equiv="refresh" content="0; url=prelogauto.cfm?badLogin=yes"> </cfif>

212


5章 美味しいWebページのできあがり

■図 prelogauto.cfmの表示結果

213


最後に一息 CGI変数 これまで出てきていませんが、ちょっと休憩として、CGI変数についてお話しま しょう。掲示板などに書き込みをすると、自動的に、IP Addressやブラウザ情報 などが表示された覚えはないでしょうか? 具体的には、 ブラウザ名:Mozilla/5.0 (Windows; U; Win 9x 4.90; enUS; m18) Gecko/20010131 Netscape6/6.01 IP Address: xx.xx.xx.xx のような形です。 ColdFusionでも以下のように記述すると同じようにこれらの情報を出力するこ とが可能です。 <cfoutput> ブラウザ名:#CGI.HTTP_USER_AGENT#<br> IP Address:#CGI.REMOTE_ADDR#<br> </cfoutput> これは、たとえばi-modeやJ-skyなどのモバイル端末からのWebアクセスとPC からのアクセスで表示させる画面を変える場合、(モバイルからではあまり重たい 画面は見られないと思いますので、たいていの場合それ専用のページを作っている でしょう)この手法を利用して自動的にモバイルユーザーをモバイル専用ページに 飛ばしてやることが可能です。 たとえば、i-modeユーザーであれば、そのブラウザ情報の中には、"DoCoMo" という文 字 列 が含 まれることになっていますので、 あなたのサイト名 が、 http://www.example.com/index.cfmでありi-mode専用ページのトップページが http://www.example.com/i/index.cfmならば、http://www.example.com/index.cfm の先頭に、次のようにコードを書けば理想的な結果が得られることでしょう。 <cfif cgi.http_user_agent CONTAINS "DoCoMo"> <cflocation url="http://www.example.com/i/index.cfm" addtoken="no"> </cfif>

214


5章 美味しいWebページのできあがり

215


C

O

L

U

M

N

「あとがき」のようなもの…。

最後まで読破された皆さんにCheers!!

以下に記します。きっと、皆さん、開発、実験

最後まで読んでいただき、ありがとうございま

などされていて、疑問点などが山積した時に、一

す。読破された皆さんなら、もうオリジナリティ

体どこに“訪”ねれば、正解が得られるのだろ

ーあふれる、ホームページをCFMLを使って作成

う? という不安を抱くでしょう。実際、私自身

できるであろうと期待しています。まだまだ、説

もそうでした。しかし、米国のColdFusion に関

明したりないところ、壊れた日本語だったところ

するサポート体制は見事なもので、決して日本で

など、まずい点を色々見つけられた方もいらっし

は味わったことのない体験をさせてもらいました。

ゃるかもしれません。ただ、CFMLがどのような

現マクロメディア社のサポートフォーラムに質問

言語で、どのようなことを実現できるものなのか

事項を書き込むと必ずレスポンスがある上、なん

については、ある程度わかっていただけたと思い

と電話もいただきました。そして、ひとつひとつ

ます。本書は入門編ですが、著者の期待に応え

の問題を解決できたのです。これは是非、皆様に

てくれる形で、日本国内でColdFusion が普及し

伝えておきたい体験です。ただ、そのサポートフ

た暁には、著者も色々研究を重ねて、中級編を

ォーラムは当然ですが、全部英語なので、英語が

執筆できればと思っています。実際、掲示板など

嫌いな方は、日本国内のサポートページなどで充

の作成も本書に含まれる知識内で、作成いたしま

実したところに質問を書き込ませてもらう方がい

したし、ご紹介したかったのですが、そこまで時

いかもしれません。著者自身、知らなかったので

間、体力、他もろもろについて余力がなく、完全

すが、日本国内でもかなり高度な話をされている

な入門編とさせていただきました。本書の核とな

サイトもあるようですので、そこなら回答してい

る部分は、米国滞在中に、自分自身のリマイン

ただけると思います。また、株式会社アイ・テ

ダーとして書き溜めたものですが、帰国後、この

ィ・フロンティアが、国内のColdFusion販売代

ような形で発表できることになり、非常に幸せな

理店をされていて、定期的にセミナーなども開か

限りです。もちろん、帰国後は、本業を抱えてい

れているようですので、ColdFusionに興味をもっ

ましたので、夜部屋に帰って、加筆修正などする

ていただけた方は、一度訪れてみるのもいいかも

のは、非常に大変なものでありましたし、新鮮な

知れません(著者自身、帰国後は時間がなくて、

体験でもありました。今日の出版に至るまで、イ

一度も訪れたことがないのですが、この執筆作業

ンプレス編集部の紙屋様はじめ、その他色々な方

が終わって余裕が出てきたら、お邪魔してみたい

のご協力をいただきました。関係者の皆様方にこ

と思っています)。将来的に、日本でも大いに

の場を借りて心より御礼申し上げます。

ColdFusionが盛り上がり、米国のような完璧な サポート体制ができれば万々歳です。最後に

最後にひとつ重大なことを書き忘れましたので、

ColdFusionの日本での成功を祈って乾杯!

(参考)株式会社アイ・ティ・フロンティア ホームページ&お問い合わせ先 URL : http://cfusion.itfrontier.co.jp/

216

E-mail : cfusion@itforntier.co.jp


付録


付録1 IISのインストール IISをインストールする ここでは、Windows 2000の場合を例に、IIS(インターネットインフォメ ーションサービス)というWebサーバーのインストール手順を示します (IISはWindows 2000/NT/XP Professionalには標準で入っています)。この場 合、Webルートディレクトリは「C:¥Inetpub¥wwwroot」になります。よっ て、作成したcfmファイルは、このディレクトリに置いてください。

1. [コントロールパネル]を開く

[スタート]-[設定][コントロールパネル] をクリック

218


付録 2. [アプリケーションの追加と削除]を開く [アプリケーションの追加 と削除]をダブルクリック

3. [Windowsコンポーネントの追加と削除]を開く

[Windowsコンポーネント の追加と削除]をクリック

219


4. [インターネットインフォメーションサービス(IIS)]を選ぶ

[インターネットインフォメーシ ョンサービス(IIS)]をクリック

Windows 95/98/Meのときは Windows 95/98/Me、あるいはWindows XP Home Editionを利用している 場合は、PWS(パーソナルWebサーバー)やApacheを利用するという手 段も考えられます。これらはインターネット上からダウンロードが可能で す。ApacheベースでColdFusionを利用する場合は、インストール以外に も作業が発生しますが、それについては、「付録2 ColdFuion Server 5のイ ンストール」で説明します。

220


付録 5. IISがインストールされる

このメッセージが表示されたら Windows 2000のCD-ROMを CD-ROMドライブにセットする

[OK]をクリック

221


6. IISのインストールが続行される

7. IISのインストールを完了する

[完了]をクリック

222


付録 8. ウィンドウを閉じる

[閉じる]をクリック [閉じる]ボタンを クリック

223


付録2 ColdFusion Server 5のインストール 付録CD-ROMからColdFusion Server 5のインストール Webサーバーがインストールできたら、今度はいよいよColdFusionサーバ ーのインストールです。ここでもWindows 2000を例にその手順を紹介しま す。また、使用するWebサーバーは、付録1で説明済みのIISを例とします。

1. インストーラを起動する CD-ROMドライブを開き、 [cfusion]フォルダを開く

[cfserver-50-win-ja] をダブルクリック

224


付録 2. 展開するフォルダを選ぶ

[次へ]をクリック

3. ファイルの展開が始まる

225


4. インストーラが起動する

[次へ]をクリック

226


付録 5. 必要なプログラムが表示される

[次へ]をクリック

手順5の画面が表示されないこともある この例では「Microsoft Runtimeのチェック中」で「Status Not Found」と なってしまったので、次にこれをインストールする画面も示しました。た だし、何も問題が起こらなかった場合は手順8の「ColdFusion 5のInstallウ ィザードへようこそ」というステップまで自動的にジャンプします。

227


6. 不足しているプログラムのインストールを始める

[開始]をクリック

228


付録 7. 不足しているプログラムのインストールが完了する

[OK]をクリック

8. コンピュータの再起動後、インストーラが起動する

[次へ]をクリック

229


9. 使用許諾契約に同意する

[はい]をクリック

10. ユーザー名と会社名を入力する

ユーザー名と会社名を入 力し、[次へ]をクリッ ク

230


付録 11. 使用するWeb サーバーを選ぶ

IISが選択されていることを 確認し、 [次へ]をクリック

評価版とシリアル番号 ここでは付属のCD-ROMからインストールする手順を示していますが、も しもColdFusion Serverを購入済みであれば、製品に付属しているシリアル 番号を手順10で入力してください。そうでない場合、シリアル番号の欄を 空欄にするとColdFusion Server 5 Enterprise Editionを30日間の評価版と して利用することができます。30日が経過するとシングルユーザーモード に切り替わります。つまり、外部からの接続は不可で1ユーザーのみの限 定使用版として利用することが可能です。

231


12. ColdFusion Serverのインストール先を選ぶ

[次へ]をクリック

13. インストールするコンポーネントを選ぶ

[ドキュメント]と[サ ンプル]を追加し、[次 へ]をクリック

232


付録 14. 管理者ページへログインするためのパスワードを設定する

パスワードを入力

コンポーネントの選択&パスワードの 割り当てについて 手順12のコンポーネントの選択では、標準でチェックが付いているものだ けでもColdFusionは正常に動作します。ただし、参考になるドキュメント やサンプルも用意されていますので、ここでは[ドキュメント]と[サン プル]を追加で選択しました。 また、その次のステップの「パスワードの割り当て」では、ColdFusion管 理者ページへアクセスするためのパスワードを設定します。これを忘れる と各種設定ができなくなってしまいますので、忘れないようにしてくださ い。また、ColdFusion Studioを利用してアプリケーション開発を行う場合、 ColdFusion Serverへアクセスするときに利用するパスワードの指定もここ で行います。ColdFusion Studioを利用する予定がない場合であれば、 [ColdFusion StudioパスワードにColdFusion Administratorパスワードを 使用する]にチェック付けてかまわないでしょう。

233


15. ColdFusion Studioのパスワードを設定する

[ColdFusion Studioパスワードに ColdFusion Administratorパスワー ドを使用する]をクリック

16. インストール内容の確認をする

インストール内容を確認 し、[次へ]をクリック

234


付録 17. ColdFusion Serverのインストールが始まる

235


18. インストールが完了するまでしばらく待つ

236


付録 19. インストールが完了する

[完了]をクリック

237


20. インストール後の確認を行う

[確認]をクリック

[インストールテストを 実行する]をクリック

238


付録 21. ページを閉じる

[閉じる]ボタンをクリ ック

239


22. ColdFusion管理者ページを開く

[開いてください]をク リック

240

[最大化]ボタンをクリ ック


付録 23. ColdFusion管理者ページにログインする

パスワードを入力し、 [パスワード]をクリッ ク

ColdFusion管理者ページって? ColdFusion管理者ページでは、文字通り、Coldfusion Serverの管理作業を 行います。既に本書内で説明した「データソースの登録」、「Verity コレク ションの作成」、「メールサーバーの指定」を始め、デバッグの設定や、動 作状況把握のためのログに関する設定、その他、同時処理要求数の制限な ど、各種パラメータの設定を行います。

241


24. ColdFusion管理者ページが開いた

本書の中で利用することがあるの で、「お気に入り」に登録しておく と簡単にアクセスできる

ColdFusionのマニュアル ColdFusionを正しくインストールすると、「C:¥Inetpub¥wwwroot」に 「CFDOCS」というフォルダができます。そこにはColdFusionのマニュア ルがインストールされていて、Webブラウザで閲覧することが可能です。 また、ColdFusion管理者ページの上部にある[マニュアル]というハイパ ーリンクをクリックしても表示することができます。 たとえば関数の一覧やタグの一覧を参照したい場合は、このフォルダの中 の「CFML_Reference」フォルダにある「contents.htm」というファイル を開いてください。この他にもさまざまな情報がこのフォルダの中に収め られています。

242


付録

Apacheでの設定 ApacheをWebサーバーとして利用する場合は、ColdFusion Server 5をイ ンストールしたあとに設定が必要です。手順12で選択した「インストール 先」ディレクトリ(標準ではC:¥CFusion)の中の「BIN」ディレクトリの 中に「ApacheModuleColdfuion.dll」というDLLがありますので、これを 「¥Apache¥modules」にコピーしてください。更に、httpd.confを開き、 LoadModule coldfusion_module modules/ApacheModuleColdFusion.dll という一行を追加する必要があります。それが終わったら、Apacheを再起 動してください。

243


付録3 Webページ作成の準備 テスト用のフォルダを作る 自分のパソコンにWebサーバーをインストールし、ColdFusionのインストール も完了したら、実際にcfmファイルを設置するためのフォルダを作っておかなくて はいけませんね。 本 書 の場 合 はW e b サーバーとしてI I S を使 いますので、 「C:¥Inetpub¥wwwroot¥」に保存されているcfmファイルをブラウザから見て試す ことができます。ここでは「cftest」というフォルダを作り、その中に本書で作成 するcfmファイルを保存することになります。

1. [マイコンピュータ]を開く

[マイコンピュータ]を ダブルクリック

244


付録 2. Cドライブを開く

[ローカルディスク(C)] をダブルクリック

3. [Inetpub]フォルダを開く

[Inetpub]をダブルクリ ック

245


4. [wwwroot]フォルダを開く

[wwwroot]をダブルク リック

5. 新しいフォルダを作る

右クリックし、[新規作 成]-[フォルダ]をクリ ック

246


付録

6. フォルダに名前を付ける

フォルダに「cftest」と 名前を付ける

本書ではこのフォルダに、作成したWebページを 保存します。アクセスするには、 http://127.0.0.1/cftest/○○○○.cfm とブラウザのアドレスバーに入力します

247



索 引

構文___________________48

記号

処理フロー________________45 CFELSEIF _________________44

# ___________________28, 41

構文___________________48 処理フロー________________45

A add_movie.cfm _______________73 adding_movie.cfm _____________74 adding_movie_jump.cfm _________105 adding_movie2.cfm ____________75 AND ____________________44 answer.cfm ________________47 Apache 設定 __________________243 application.cfm ___________182, 202 ArrayNew_________________116

C

CFFILE _______________121, 128 action ______________128, 134 destination ______________128 filefield ________________128 nameconflict _____________129 処理フロー _______________122 CFFLUSH _________________52 CFFORM __________________36 構文___________________38 処理フロー________________36 CFGRID CFFORM ________________43 CFIF ____________________44 構文___________________48 処理フロー________________45 利用心得_________________44

CFABORT _________________88 CFAPPLET CFFORM ________________43 CFAPPLICATION _____________183 属性 __________________183 CFBREAKE _____________111, 116 CFCASE ______________117, 128 構文 __________________118 属性 __________________118 CFCATCH ________________135 構文 __________________135 CFCOL_________________66, 68 構文___________________68 処理フロー________________67 属性___________________70 CFCOLLECTION _____________163 CFCOOKIE ________________168 expires ________________170 有効期限 ________________170 CFELSE __________________44

CFINCLUDE ______________32, 34 template ________________35 構文___________________34 処理フロー________________32 属性___________________35 CFINDEX collection _______________153 Collectionname ____________152 Directory _______________152 extensions ______________153 type__________________153 urlpath ________________152 属性 __________________154 CFINPUT__________________38 CFINSERT _______________72, 74 構文___________________75 処理フロー________________73 属性___________________79 CFLOCATION ____________104, 178 後戻り _________________106

249


索 引

構文 __________________105

構文___________________83

処理フロー _______________104

処理フロー _____________80, 89

属性 __________________106

属性___________________87

CFLOOP ___________111, 112, 114

特定フィールドの更新___________93

属性 __________________115

CGI変数 __________________214

cfm ____________________20

ColdFusion ______________12, 22

CFMAIL

関連製品_________________18

server _________________166

処理フロー________________17

属性 _______________188, 189

特徴___________________20

メール形式 _______________188

比較___________________24

CFML _______________13, 14, 20

ColdFusion管理者ページ ________55, 241

コメント_________________39

URL __________________55

CFOUTPUT ______________28, 61

Verityコレクション ___________149

構文___________________28

サーバの設定 ______________166

属性___________________29

サーバポート ______________166

CFPARAM _____________107, 109

接続タイムアウト ____________166

構文 __________________109

データソース ______________149

属性 __________________110

メールまたはメールログ記録 _______166

CFQUERY ________58, 59, 60, 68, 177

Cookie __________________177

オプション属性______________62

発行 __________________168

検索 __________________142

有効期限 _____________170, 171

構文___________________60

Cookie変数 ________________168

処理フロー _____________59, 63

count.cfm ________________111

属性___________________62

D

データ検索 _______________142 CFSEARCH _____________155, 158 CFSET _______________107, 114

date.cfm __________________28

属性 __________________107

DateFormat ______________28, 30

CFSWITCH _____________117, 128

DELETE

構文 __________________118

SQL __________________140

属性 __________________118

delete.cfm _________________96

CFTABLE _______________66, 68

delete_movie_ID.cfm ____________99

構文___________________68

deleting_movie.cfm ____________98

処理フロー________________67

delpick.cfm ________________95

属性___________________70

dologin.cfm________________176

CFTREE ________________36, 41

dologinauto.cfm _____________212

cftree.cfm _________________42 CFTRY __________________135 構文 __________________135 CFUPDATE ________________80 formfields________________93

250

E EQ _____________________44


索 引

Evaluate _________________162

Len____________________136 LESS THAN ________________44

F

LESS THAN OR EQUAL __________44 Listappend _____________129, 132

File.ClientFileExt _____________129

logined.cfm________________179

File.ClientFilename ____________129

loopdisplay.cfm______________112

Find ___________________136

LT _____________________44

firesearch.cfm ______________145

LTE ____________________44

fireworks.cfm _______________144 Flash 5 ______________19, 20, 26

M

footer.cfm _________________34 mail.cfm _________________186

G

main.cfm__________________34 main.html _________________33

GetFileFromPath _____________163

movie_display.cfm _____________59

GREATER THAN ______________44

movie_display_sep.cfm __________108

GREATER THAN OR EQUAL ________44

movie_displayall.cfm ____________78

GT _____________________44

movie_select.cfm _____________63

GTE ____________________44

moviesummary.cfm____________138 musicplace.cfm _____________203

H

N

header.cfm_________________34 NEQ ____________________44

I IF _____________________50

Now ____________________30

O

index.cfm_________________151 INPUT ___________________83

ODBC ___________________54

inputprofile.cfm ______________37

ODBCデータソース ___________55, 56

INSERT

OLE-DB __________________54

SQL________________74, 140

OR _____________________44

Int _________________114, 116 IS _____________________44

P

IS NOT___________________44 IsDefined _______________82, 87

oscar_get.cfm _______________67 ParameterExists _____________172

L

pickup.cfm _________________91 posted.cfm ________________205

Left ___________________136

prelog.cfm ________________174

251


索 引

prelogauto.cfm ______________210

update_movie.cfm _____________81

premail.cfm________________185

updating_movie.cfm ____________83

prepick.cfm ________________90

upload.cfm ________________124

primarysearch.cfm ____________156

uploaded.cfm_______________133

profile.cfm _________________39

URL ___________________158

Q

URL変数 ____________88, 100, 196

question.cfm________________46

userdologin.cfm _____________202

ColdFusion管理者ページ _________55 データ削除________________99 userlogin.cfm_______________190

R

V

register.cfm _______________197 Reverse _________________136

Verity Collections ____________148

Right ___________________136

形成 __________________163 作成 __________________149

S search.cfm ________________160 SELECT SQL __________________140 SET

Verity Development Kit _______148, 164 Verity K2 Server _____________164 Verityコレクション 言語 __________________150 名前 __________________150 パス __________________150

SQL __________________88

W

sign_up.cfm _______________192 SMTPサーバー ___________166, 184 SQL ___________________140

Webアプリケーション __________12, 22

SQLステートメント _____________60

Webページ

string.cfm ________________137

メール送信 _______________184

Switch _______________117, 119

welcome.cfm _______________168

switch.cfm ________________117

welcoming.cfm ______________170 WHERE_____________62, 102, 140

T

TimeFormat ________________31 Trim __________________83, 87

拡張子 ___________________20 関数 ____________________30

U UPDATE SQL _____________86, 88, 140

252

ArrayNew _______________116 DateFormat ______________30 Evaluate _______________162 Find __________________136


索 引

GetFileFromPath ___________163

条件分岐命令 ________________50

Int___________________116

シリアル番号 _______________231

IsDefined ________________87

セッション変数____________181, 183

Left __________________136

全文検索 _________________148

Len __________________136

属性

Listappend ______________132

CFAPPLICATION ___________183

Now __________________30

CFCASE________________118

ParameterExists ___________172

CFCOL _________________70

Reverse ________________136

CFINCLUDE ______________35

Right _________________136

CFINDEX _______________154

TimeFormat ______________31

CFINSERT _______________79

Trim __________________87

CFLOCATION _____________106

クライアント変数 _____________183

CFLOOP _______________115

構文

CFMAIL ________________189

CFCASE________________118

CFOUTPUT _______________29

CFCATCH _______________135

CFPARAM ______________110

CFCOL _________________68

CFQUERY _______________62

CFELSE ________________48

CFSWITCH ______________118

CFELSEIF________________48

CFTABLE ________________70

CFFORM ________________38

CFUPDATE _______________87

CFIF __________________48

CFINCLUDE ______________34 CFINSERT _______________75 CFLOCATION _____________105

タグ

CFOUTPUT _______________28

CFABORT _______________88

CFPARAM ______________109

CFAPPLICATION ___________183

CFQUERY _______________60

CFCATCH _______________135

CFSWITCH ______________118

CFSEARCH ______________158

CFTABLE ________________68

CFTRY ________________135

CFTRY ________________135

多分岐命令 ________________119

CFUPDATE _______________83

データ

コメント

fireworksテーブル ___________142

CFML __________________39

movieテーブル______________58 oscarテーブル ______________66

検索___________________89 更新___________________89

条件表記 __________________44

削除___________________94

意味 __________________102

出力___________________28

利用例 _________________103

追加___________________72

条件文 __________________117

呼び出し_________________59

条件分岐 __________________44

253


索 引

データ削除

変数

処理フロー________________94

prefix _________________189

データソース ______________54, 56

確認___________________87

登録___________________54 データベース

定義 __________________107 ポンド記号 _________________29

検索 __________________142

更新___________________80 準備 ________________54, 58 データ削除________________94

マニュアル ________________242

データの追加_______________72

メールサーバー

データベーステーブル

登録 __________________166

結合___________________66

メール送受信 ________________17

データベースとの連携 ____________16

メール送信 ________________184

データベースの検索

文字列関数 ________________136

処理フロー _______________143 等価 ____________________44

ラ ループ __________________111 例外エラー ________________135

配列 ___________________116 パスワード ColdFusion管理者ページ ________233 ファイル アップロード ______________121 対話処理 ________________121 ファイルとの対話 ______________17 ファイル変数 _______________129 ファイル名 抽出 __________________163 フィールド fireworksテーブル ___________142 movieテーブル______________58 oscarテーブル ______________66 uploadfilesテーブル __________123 usersテーブル _____________174 フォーム 応用___________________41 利用___________________36 不等価 ___________________44 不等号 ___________________44

254

ログイン セキュアなサイト ____________173 ログイン認証 _______________173


■著者 真木みお(まきみお) 1971年 北海道紋別市生まれ。 1994年 北海道大学工学部情報工学科 卒業 1996年 北海道大学大学院工学研究科 修士課程修了 2000年 インターンとして渡米し、ColdFusionに出会う 現在 通信会社にネットワーク関連のセールスエンジニア として勤務している。

協力

マクロメディア株式会社 株式会社アイ・ティ・フロンティア

STAFF 本文デザイン

中沢 岳志(tplot inc.)

カバーデザイン

中沢 岳志(tplot inc.)

カバー写真撮影

蔭山 一広

紙模型作成 編集

坂 啓典(図工室) 紙屋伸成<kamiya-n@impress.co.jp>


■お買い上げ書籍についての問い合わせ先 本書の内容についてのご質問は、下記の宛先まで、返信用切手を同封の上、封書で お送りください。返信には、しばらくお時間をいただく場合がございます。 本書の範囲を越える質問には、お答えいたしかねます。あらかじめご了承ください インプレス「WebクリエイターのためのColdFusion入門 PDF版」質問係

ボタンをクリックしてWeb読者アンケートにお答えください! ホームページで読者アンケートを受け付けています。みなさまのご意見・ご要望を どしどしお寄せください。今後の企画・編集の参考にさせていただきます。 上のボタンをクリックしてCLUB IMPRESSに商品を登録してから、アンケートに お答えください。 CLUB IMPRESSは、インプレスの読者会員制度です。会員になって、これまでに 購入したインプレスの商品を登録すると、お得なポイントサービスがあります。

WebクリエイターのためのColdFusion入門 PDF版 2006年3月31日 初版第1刷発行 著 者

真木 みお

発行人

土田米一

発 行

株式会社インプレス 〒102-0075 東京都千代田区三番町20 http://www.impress.co.jp/

本書は著作権法上の保護を受けています。本書の一部あるいは全部について(ソフトウェア及びプログラムを含む)、株式 会社インプレスから文書による許諾を得ずに、いかなる方法においても無断で複写、複製することは禁じられています。

Copyright © 2006 Mio Maki. All rights reserved.


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.