分12第4回目の記事ではColdFusionでグラフを描画する例をご紹介しました。他の言語でグラフ描画をしようと思った場合,GDなどをインストールした上でラッパーライブラリーを介して操作するなど,グラフを描画するにも非常に煩雑な操作が伴います。対してColdFusionではcfchartタグ,cfchartseriesタグ,cfchartdataタグを用いて,HTMLのテーブルを構築するのと同じような感覚で,タグを記述するのみでグラフ描画を行うことができると分かりました。今回はHTMLのフォームから送られてくるデータの処理の仕方を学びます。今まで紹介していなかったColdFusion独自の概念として「スコープ」と言うものがあります。スコープとは,他の言語で言うところのローカルスコープ,グローバルスコープとは若干違った意味合いになります。今までの例で何気なく使っていた変数は,全て『Variablesスコープ』というスコープの中に入っていました。以下の例を実行してみましょう。以下の例ではクエリーを発行し,結果をqryという名前の変数に代入しています。8」という文字列を代入しています。その後,Variablesスコープをcfdumpしています。{cf_root}フォルダ({cf_root}はColdFusionをインストールしたディレクトリです。Windowsでは『C:\ColdFusion8』になります)内にある『wwwroot』の中に『gihyo』という名前のフォルダを作り,その中に『5』というフォルダを作ってください。『⁠5』のフォルダの中に以下のような中身のファイルをvariables.cfmとして保存してください(ファイルのパスは{cf_root}/wwwroot/gihyo/5/variables.cfmになります⁠)⁠。保存時の文字コードはUTF-8としてください。その後,http://127.0.0.1:8500/gihyo/5/variables.cfmでアクセスしてみましょう。variables.cfmの実行結果ご覧頂いて分かるとおり,Variablesスコープは構造体です(cfdumpしたとき青色になるものは構造体です。「struct」というラベルが付いています⁠)⁠。構造体のキーとして「QRY」と「STR」があり,その中にクエリーの結果や代入した文字列が保持されていることが分かります。今まで何気なく使用していたページ内で定義した変数は全てVariablesスコープという構造体の中に保存されていることがわかります。cfdumpの結果を見て分かるとおり,ColdFusionは変数の大文字小文字を区別しません。従って,「⁠Variables.qry」と書いても「Variables.QRY」と書いても同じ変数を参照します。変数の宣言時と参照時で違う綴りをしているとプログラミングミスに繋がる可能性があるため,CFMLテンプレート中では綴りは統一しておくことが望ましいでしょう。HTMLフォームのデータを保持するFormスコープHTMLフォームからPOSTで送ったデータはFormスコープというVariablesスコープとは別のスコープに保存されます。以下の例を{cf_root}/wwwroot/gihyo/5/form.cfmとして保存してください。form.cfmにアクセス後,テキストフィールドに適当な文字を入力し「送信」というボタンをクリックしてみましょう。form.cfm実行結果。「⁠あいうえお」と入力して送信した。ご覧頂いて分かるとおり,POSTで送信されたデータがFormスコープに保持されていることが分かります。Variablesスコープとは別扱いになっていることも分かると思います(フォームと変数で同じ「str」という変数名を使っていますが,スコープが別になっているため上書きされていません⁠)⁠。PHPでPOSTで送信された値が$POSTという連想配列に代入されるのと同じような感覚です。FormスコープもVariablesスコープと同様に構造体のため,変数の大文字小文字を区別しません。ここでいくつか見慣れないコードが出てきます。StructKeyExists()関数は,第一引数に渡された構造体に,第二引数で渡されたキーが存在するかどうかを返す関数です。'submit')とは,Formスコープに「submit」というキーが存在するかどうかを判定しています。cfifの部分で『HTMLフォームからデータが送信されたかどうか』を判定しています。同じように変数が定義されているかどうかを調べる関数にはIsDefined()関数がありますが,こちらは少々厄介です。IsDefined('Form.submit')とすると,Formスコープの中に「submit」という変数が定義されているかどうかを調べることもできますが,仮にそれが存在しなかった場合,Variablesスコープの「Form」という名前の構造体に「submit」と言うキーが存在するかどうかも調べてしまいます(つまりIsDefined('Variables.Form.submit')を実行しているのと等価です⁠)⁠。このようにIsDefined()関数は,参照可能な値をすべて辿っていって,定義されているかどうかを調べてしまうので,意図しない値を返すことがあります。参照可能な値をすべて辿るため,パフォーマンスの観点からもあまりお奨めできません。したがって,あるスコープに変数が定義されているかどうかを調べるのにはStructKeyExists()関数を使いましょう。次に見慣れない関数としてSetEncoding()関数があります。これは,POSTで渡されてくるデータの文字コードを指定するものです。今回はUTF-8のページから自分自身にPOSTしているため,POSTの文字コードはUTF-8であると明示しています。"Shift_JIS")>と,Shift_JISのデータが送られてくると明示する必要があります。12ColdFusion著者プロフィール酒井克幸(さかいかつゆき)フリーのテクノロジーコンサルタント。サーバー選定やネットワーク設計などハードウェアレイヤーから,Webアプリケーションの実装(サーバーサイド,クライアントサイド共)などのソフトウェアレイヤーまでの幅広い経験を活かし,クライアント企業のWebアプリケーション構築支援を行っている。Adobe製品(特にMacromedia)製品には精通している。ColdFusionとは何か。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。