ColdFusionカフェテリア
SAMURAIZ

 

ColdFusionの関数の紹介・後編

作成日: 2009年7月1日
作成者:ハイミン・エンタープライズ(株) 千葉 博胤
佐藤 弘一
最終更新日: 2009年7月1日

ColdFusionの関数の紹介・後編

 前編に引き続き、ColdFusionの関数を紹介いたします。多くの言語にある基本的な関数をはじめ、タグと同様多彩な関数が用意されています。その一部ですが紹介したいと思います。前回同様、サンプルソースはそのままコピー&ペーストで実行できるようにしてあります。是非実際に動かしてみてください。

 

ColdFusion関数

構造体関連関数
   StructNew/StructFind/StructClear/StructFind/

セキュリティ関連関数
   hash/encrypt/decrypt

その他関数
   URLEncodedFormat

ユーザー定義関数
   uDate

 

■構造体関連関数

構造体関連の操作を行います。

○StructNew
構造体を作成します。

例)

<cfset strctUser = StructNew()>
<cfdump var="#strctUser#" label="strctUser">

表示結果

構造体の宣言をしただけなので、<cfdump>タグで見ると「empty」になっています。
 

○StructFind
構造体のキーに対応する値を取得します。

例)

<cfset strctUser = StructNew()>
<cfset strctUser.name = "Koichi">
<cfset strctUser.age = "26">
<cfset strctUser.address = "Yokohama">
<cfset strctUser.company = "Haimig">
<cfdump var="#strctUser#" label="strctUser"><br>
<cfoutput>
構造体キー「company」の値:#StructFind(strctUser,"company")#
</cfoutput>

構造体キー「company」の値:Haimig

構造体はキーと値から構成されます。構造体strctUserには、name,age,address,companyという4つのキーとそれぞれのキーに対応する値が存在します。構造体へは、<cfset>タグを使って値をセットします。
StructFind関数は構造体のキーを指定して、対応する値を抽出します。例では、構造体「strctUser 」のキー「company」には、値「ハイミン」が入っているので、戻り値は「ハイミン」になります。
 

○StructDelete
構造体の指定したキーを削除します。

例)

<cfset strctUser = StructNew()>
<cfset strctUser["name"] = "Koichi">
<cfset strctUser["age"] = "26">
<cfset strctUser["address"] = "Yokohama">
<cfset strctUser["company"] = "Haimig">
<cfdump var="#strctUser#" label="strctUser"><br>
<cfset tmp=StructDelete(strctUser,"company")>
<cfdump var="#strctUser#" label="strctUser">

構造体の表記は、前述のStructFind関数の例のように、「 構造体名.キー名 」で取得する方法と上記の「 構造体名["キー名"] 」で取得する方法があります。どちらを使用してもあまり変わりはありません。違いは[]を使用した場合は、キー名にスペースを使用できるくらいです。
肝心のStructDelete関数ですが、指定したキー「company」を削除しています。削除前と削除後の<cfdump>タグの出力を見ると、キー「company」が削除されているのがわかります。
 

○StructClear
構造体のデータをすべて削除します。

例)

<cfset strctUser = StructNew()>
<cfset strctUser.name = "Koichi">
<cfset strctUser.age = "26">
<cfset strctUser.address = "Yokohama">
<cfset strctUser.company = "Haimig">
<cfdump var="#strctUser#" label="strctUser"><br>
<cfset tmp=StructClear(strctUser)>
<cfdump var="#strctUser#" label="strctUser">

表示結果

StructDelete関数はある1つのキーを削除しますが、StructClear関数は構造体自体のすべてのキーと値を削除します。構造体自体は削除されずに残っています。
 

○StructCount
構造体のキーの数を取得します。

例)

<cfset strctUser = StructNew()>
<cfset strctUser.name = "Koichi">
<cfset strctUser.age = "26">
<cfset strctUser.address = "Yokohama">
<cfset strctUser.company = "Haimig">
<cfdump var="#strctUser#" label="strctUser"><br>
<cfoutput>
構造体「strctUser」のキーの数:#StructCount(strctUser)#
</cfoutput>

表示結果


構造体「strctUser」のキーの数:4

name,age,address,companyという4つのキーがあるので、戻り値は「4」となります。
 

○StructKeyExists
構造体に指定したキーが存在するか調べます。

例)

<cfset strctUser = StructNew()>
<cfset strctUser.name = "Koichi">
<cfset strctUser.age = "26">
<cfset strctUser.address = "Yokohama">
<cfset strctUser.company = "Haimig">
<cfdump var="#strctUser#" label="strctUser"><br>
<cfoutput>
キー「address」は存在するか:#StructKeyExists(strctUser,'address')#<br>
キー「country」は存在するか:#StructKeyExists(strctUser,'country')#
</cfoutput>

表示結果


キー「address」は存在するか:YES
キー「country」は存在するか:NO

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つのキーの値になります。

以下の例を見てみます。
 

<cfset form.userId="administrator">
<cfset form.password="admin">
<cfdump var="#form#" label="form">

表示結果

構造体「form」の中にuserId,passwordが格納されているのがわかります。同様に、Session変数、url変数、Client変数、Variables変数等も構造体として保持されています。ですので、各種変数の存在チェックを行う場合は、このStructKeyExists関数を使用します。

更に例を見てみます。
 

<cfif StructKeyExists(form,'errCode')>
    エラー処理を行います。
<cfelse>
    登録処理を行います。
</cfif>

表示結果

登録処理を行います。

変数「form.errCode」が存在する場合はエラー処理を行い、存在しない場合は登録処理を行うというロジックです。変数「form.errCode」は存在しないため、このケースではStructKeyExists(form,"errCode") は「false」を返し、登録処理を行います。
同じ様な機能で、IsDefine関数というものもありますが、こちらはキーの指定がないため、該当の変数が見つかるまですべての種類の変数を検索してしまいます。異なるスコープで同じ変数名を使用していた場合、想定しない値を返してしまう事もあるので、変数の存在有無は、IsDefine関数ではなく、StructKeyExistsを使うようにした方がいいでしょう。
 

■セキュリティ関連関数

セキュリティ関連の操作を行います。

○hash
fingerprintと呼ばれる固定長の乱数に変換します。hash値から元のデータを復元することはできません。
使い方としては、例えばパスワードなどをデータベースに格納しておく際、パスワードを平文のまま格納するのではなく、hash値を格納しておくようなケースが考えられます。

例)

<cfset password = "sato*0/14wu">
<cfoutput>
#password#<br>
CFMX_COMPAT:#hash(password,'CFMX_COMPAT')#<br>
MD5:#hash(password,'MD5')#<br>
SHA:#hash(password,'SHA')#<br>
SHA-256:#hash(password,'SHA-256')#<br>
SHA-256:#hash(password,'SHA-384')#<br>
SHA-512:#hash(password,'SHA-512')#
</cfoutput>

表示結果

元データ :sato*0/14wu
CFMX_COMPAT :86A31D0BDE8204F3271C3E80720A8939
MD5 :86A31D0BDE8204F3271C3E80720A8939
SHA :9C539E807C1CE9A292151E75B7AB6ED46D96DF6D
SHA-256 :34CFF9507A4831827E4CD6F9E18AD367E5D0555DB126BD3858AEB5A11411CF22
SHA-384 :BE5258F3D87918FB13A648DBC04D53862D8B09B5DA5F91A4C9F097DF318F12CB5EB500A79359C6C8B558B8B9BFF92664
SHA-512 :414C650451A016322F58856334794AE4D7A6CCEB6B46539BD268A0C2316782CCEE98F60964FF49220BE7169A3490418F696BBDC5B22FE8EC6FE29A84C0749173

第2パラメータに、ハッシュするためのアルゴリズムを選択する事ができます。
 

○encrypt/decrypt
文字列を暗号化/複合化します。

例)

<cfset password = "sato*0/14wu">
<cfset encKey = generateSecretKey("DESEDE")>
<cfset ecPaswd = Encrypt(password,encKey,"DESEDE")>
<cfset dcPaswd = Decrypt(ecPaswd,encKey,"DESEDE")>
<cfoutput>
パスワード:#password#<br>
暗号化:#ecPaswd#<br>
複合化:#dcPaswd#
</cfoutput>

表示結果

パスワード :sato*0/14wu
暗号化 :0,;B^X*IQ-:S9V5L&Z-2SA@
複合化 :sato*0/14wu

Encrypt関数にて暗号化、Decrypt関数にて複合化しています。暗号化/複合化にはキーが必要です。generateSecretKey関数を使用してキーを生成します。generateSecretKey関数のパラメータには使用する暗号化アルゴリズムを指定します。
 

■その他関数

○URLEncodedFormat
URL文字列をエンコードします。リンク等でURLパラメータに2バイト文字がある場合、URLEncodedFormat関数を使用してエスケープシーケンスに変換します。

例)

<cfoutput>
<a href="index.cfm?name=#URLEncodedFormat('佐藤')#" target="new">リンク</a>
</cfoutput>

表示結果

url変数「name」に値「佐藤」が入っていますが、この文字列をそのままURLパラメータで渡すのではなく、URLEncodedFormat関数を使用して「%E4%BD%90%E8%97%A4」という形に変換します。リンクのマウスオーバーで、ブラウザのステータスバーにURLが表示されますが、変数「name」に渡された値が変換されているのがわかります。渡されたページでは明示的にデコードする必要はなく、ColdFsuionがデコードしてくれます。
 

■ユーザー定義関数(UDF)

ColdFusionでは、独自に関数を作成することができます。

例)

<cffunction name="uDate" returntype="String">
    <cfargument name="year" required="true"><!--- 年 --->
    <cfargument name="month" required="true"><!--- 月 --->
    <cfargument name="day" required="true"><!--- 日 --->
    <cfargument name="type" required="true"><!--- タイプ --->
    <cfswitch expression="#type#">
        <cfcase value="1">
            <cfreturn DateFormat(CreateDate(year,month,day),"yy/mm/dd")>
        </cfcase>
        <cfcase value="2">
            <cfreturn DateFormat(CreateDate(year,month,day),"yyyy.mm.dd")>
        </cfcase>
        <cfcase value="3">
            <cfreturn DateFormat(CreateDate(year,month,day),"yyyy年mm月dd日")>
        </cfcase>
        <cfdefaultcase>
            <cfreturn DateFormat(CreateDate(year,month,day),"yyyy/mm/dd")>
        </cfdefaultcase>
    </cfswitch>
</cffunction>

<cfoutput>
#uDate(year="2009",month="07",day="01",type="3")#
</cfoutput>

表示結果

2009年07月01日

年・月・日と表示タイプをパラメータに持ち、表示タイプによって日付フォーマットを変える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コンポーネントについて解説したいと思います。

ColdFusionの各種情報の配信


最新情報
■2022/12/14 〜
ColdFusion 基礎プログラミング
記事一覧(随時更新)

■2022/6/28
Adobe ColdFusion 2021
インストール セットアップ情報
CFサーバーのインストール

■2019/11/27
『ColdFusion 実験室』
実験7

■2019/11/27
Adobe ColdFusion 2018
インストール セットアップ情報
CFサーバーのインストール

■2017/6/26
『ColdFusion 実験室』
実験6

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

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

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

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

教材プログラム単体販売


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