作成日: 2009年7月1日 | |
作成者:ハイミン・エンタープライズ(株) | 千葉 博胤 佐藤 弘一 |
最終更新日: 2009年7月1日 |
前編に引き続き、ColdFusionの関数を紹介いたします。多くの言語にある基本的な関数をはじめ、タグと同様多彩な関数が用意されています。その一部ですが紹介したいと思います。前回同様、サンプルソースはそのままコピー&ペーストで実行できるようにしてあります。是非実際に動かしてみてください。
■構造体関連関数
StructNew/StructFind/StructClear/StructFind/
■セキュリティ関連関数
hash/encrypt/decrypt
■その他関数
URLEncodedFormat
■ユーザー定義関数
uDate
構造体関連の操作を行います。
○StructNew
構造体を作成します。
例)
表示結果
構造体の宣言をしただけなので、<cfdump>タグで見ると「empty」になっています。
○StructFind
構造体のキーに対応する値を取得します。
例)
構造体はキーと値から構成されます。構造体strctUserには、name,age,address,companyという4つのキーとそれぞれのキーに対応する値が存在します。構造体へは、<cfset>タグを使って値をセットします。
StructFind関数は構造体のキーを指定して、対応する値を抽出します。例では、構造体「strctUser 」のキー「company」には、値「ハイミン」が入っているので、戻り値は「ハイミン」になります。
○StructDelete
構造体の指定したキーを削除します。
例)
構造体の表記は、前述のStructFind関数の例のように、「 構造体名.キー名 」で取得する方法と上記の「 構造体名["キー名"] 」で取得する方法があります。どちらを使用してもあまり変わりはありません。違いは[]を使用した場合は、キー名にスペースを使用できるくらいです。
肝心のStructDelete関数ですが、指定したキー「company」を削除しています。削除前と削除後の<cfdump>タグの出力を見ると、キー「company」が削除されているのがわかります。
○StructClear
構造体のデータをすべて削除します。
例)
表示結果
StructDelete関数はある1つのキーを削除しますが、StructClear関数は構造体自体のすべてのキーと値を削除します。構造体自体は削除されずに残っています。
○StructCount
構造体のキーの数を取得します。
例)
表示結果
name,age,address,companyという4つのキーがあるので、戻り値は「4」となります。
○StructKeyExists
構造体に指定したキーが存在するか調べます。
例)
表示結果
name,age,address,company
1つ目の例は構造体「strctUser」に、キー「address」があるかを調べています。キー「address」は存在するので「YES(true)」が返ります。また、2つ目の例ではキー「country」は存在しないので「NO(false)」が返ります。
StructKeyExists関数は、上記のように通常は作成した構造体の中に指定したキーが存在するかを調べますが、違った使い方もあります。
ColdFusionでは、各種変数はすべて構造体による複合データとして保持されます。例えば、ある画面でuserId,passwordといった2つのform変数があったとします。これら2つのform変数値は、formという名前の構造体のuserId,passwordという2つのキーの値になります。
以下の例を見てみます。
表示結果
構造体「form」の中にuserId,passwordが格納されているのがわかります。同様に、Session変数、url変数、Client変数、Variables変数等も構造体として保持されています。ですので、各種変数の存在チェックを行う場合は、このStructKeyExists関数を使用します。
更に例を見てみます。
表示結果
変数「form.errCode」が存在する場合はエラー処理を行い、存在しない場合は登録処理を行うというロジックです。変数「form.errCode」は存在しないため、このケースではStructKeyExists(form,"errCode") は「false」を返し、登録処理を行います。
同じ様な機能で、IsDefine関数というものもありますが、こちらはキーの指定がないため、該当の変数が見つかるまですべての種類の変数を検索してしまいます。異なるスコープで同じ変数名を使用していた場合、想定しない値を返してしまう事もあるので、変数の存在有無は、IsDefine関数ではなく、StructKeyExistsを使うようにした方がいいでしょう。
セキュリティ関連の操作を行います。
○hash
fingerprintと呼ばれる固定長の乱数に変換します。hash値から元のデータを復元することはできません。
使い方としては、例えばパスワードなどをデータベースに格納しておく際、パスワードを平文のまま格納するのではなく、hash値を格納しておくようなケースが考えられます。
例)
表示結果
元データ | :sato*0/14wu |
CFMX_COMPAT | :86A31D0BDE8204F3271C3E80720A8939 |
MD5 | :86A31D0BDE8204F3271C3E80720A8939 |
SHA | :9C539E807C1CE9A292151E75B7AB6ED46D96DF6D |
SHA-256 | :34CFF9507A4831827E4CD6F9E18AD367E5D0555DB126BD3858AEB5A11411CF22 |
SHA-384 | :BE5258F3D87918FB13A648DBC04D53862D8B09B5DA5F91A4C9F097DF318F12CB5EB500A79359C6C8B558B8B9BFF92664 |
SHA-512 | :414C650451A016322F58856334794AE4D7A6CCEB6B46539BD268A0C2316782CCEE98F60964FF49220BE7169A3490418F696BBDC5B22FE8EC6FE29A84C0749173 |
第2パラメータに、ハッシュするためのアルゴリズムを選択する事ができます。
○encrypt/decrypt
文字列を暗号化/複合化します。
例)
表示結果
パスワード | :sato*0/14wu |
暗号化 | :0,;B^X*IQ-:S9V5L&Z-2SA@ |
複合化 | :sato*0/14wu |
Encrypt関数にて暗号化、Decrypt関数にて複合化しています。暗号化/複合化にはキーが必要です。generateSecretKey関数を使用してキーを生成します。generateSecretKey関数のパラメータには使用する暗号化アルゴリズムを指定します。
○URLEncodedFormat
URL文字列をエンコードします。リンク等でURLパラメータに2バイト文字がある場合、URLEncodedFormat関数を使用してエスケープシーケンスに変換します。
例)
表示結果
url変数「name」に値「佐藤」が入っていますが、この文字列をそのままURLパラメータで渡すのではなく、URLEncodedFormat関数を使用して「%E4%BD%90%E8%97%A4」という形に変換します。リンクのマウスオーバーで、ブラウザのステータスバーにURLが表示されますが、変数「name」に渡された値が変換されているのがわかります。渡されたページでは明示的にデコードする必要はなく、ColdFsuionがデコードしてくれます。
ColdFusionでは、独自に関数を作成することができます。
例)
<cfoutput>
#uDate(year="2009",month="07",day="01",type="3")#
</cfoutput>
表示結果
年・月・日と表示タイプをパラメータに持ち、表示タイプによって日付フォーマットを変えるUDFです。
UDFは、<cffunction>タグでUDFを定義し、<cfargument>にてUDFのパラメータを指定します。戻り値は<cfreturn>で指定します。
今回の例では、UDFを呼び出すページ内にUDFを定義しましたが、他にもいくつか方法があります。
(1)UDF呼び出しプログラムとは別のcfmファイルに定義し、<cfinclude>タグにて読み込みむ。
(2)ColdFusionコンポーネントでUDFを定義し、呼び出しページでインスタンスを生成して使用する。
※ColdFusionコンポーネントに関しては次回解説いたします
(3)Application.cfc にUDFを定義する。
今回の例のように、呼び出しページ内で定義すると同ページでしか使用できないのであまり有効な書き方ではないのですが、簡単に試していただく目的でこの様な書き方をしました。
連載第2回は前編・後編に渡り、ColdFusionの関数を紹介しました。ColdFusionタグと同様、ここで紹介したものはほんの一部です。他の様々なプログラム言語にある一般的な関数ほぼすべて揃っていると思います。関数を自作できるユーザー定義関数(UDF)もありますので、あらゆるケースでの対応が可能です。
さて、次回はColdFusionで開発をする際に欠かすことのできない、ColdFusionコンポーネントについて解説したいと思います。