2007/05/14

[coldfusion]cffunction内で、cfqueryを使う時の注意点

cffunction内で、cfqueryを使って、sql文を発行するのはよくあることなのですが、注意しないと、ファンクションの呼び出し元で参照できてしまうときがあります。

例をみてみましょう。

<cffunction name="lf_test">
<cfquery name="hoge" datasource="foo">
select ・・・
from ・・・
</cfquery>
</cffunction>
<cfoutput>
#lf_test()#

<cfloop query="hoge">
・・・
</cfloop>
</cfoutput>

構造は簡単。

hoge関数をコールすると、select文を発行してくれるというもの。

で、重要なところは、その次のcfloopの部分。

これ、クエリーの結果が表示されるでしょうか?

実は、これ表示されるんですねー。

内部でcfqueryを呼び出していても外部で参照することができるのです。

つまり情報として隠蔽しきれていないわけです。

ではこれを隠蔽するには??

実に簡単。

関数内部でcfscriptで変数宣言を行えばできます。

<cffunction name="lf_test">
<cfscript>
var hoge = QueryNew("");
</cfscript>
<cfquery name="hoge" datasource="foo">
select ・・・
from ・・・
</cfquery>
</cffunction>
<cfoutput>
#lf_test()#

<cfloop query="hoge">
・・・
</cfloop>

</cfoutput>

こうすることによって、呼び出し元でqueryを呼び出すことができません。
(したがって、上のソースは、cfloopでエラーを引き起こします。)

cffunction内部で、queryを実行する時に注意したいっすね。

2007/05/13

[ColdFusion]submit時の空のinput type="text"

submit時に、value=""のinput type="text"がある場合、submit先に空として送信されるみたい。

つまり、

<input type="text" value="" name="hoge">

とあった場合、送信先での、IsDefined("form.hoge")はtrueを返し、#form.hoge#は空と返す模様。

ちょっと気をつけたいです。

2007/05/12

[coldfusion]Application.cfmのイニシャルは大文字で

自宅で、Application.cfmを作って実行をかけた時に、なぜかロードされないなーと思っていたら、なんと、Application.cfmのイニシャルは大文字じゃーないといけないんですね。

小文字だとロードされないみたいです。

盲点かな

2007/05/10

[coldfusion]listループに関して

昨日に続いて今日もループネタで。

listループでlistが空だった場合、例えば

<cfset form.hoge="">
<cfloop index="i" list="#form.hoge#">
#i#
</cfloop>

とあった場合に、エラーになるのかなーと思ったら、これもならなかった。

なんて便利なんだ。

2007/05/09

[coldfusion]indexループに関して

たまーに開発をしている時に、

<cfloop index="j" from="1" to="0">
#hoge[j]#
</cfloop>

なんて書きたくなってしまう時があります。

特に、toの部分が変数で動的に変わってしまう場合。

これ、いざ実行してみるとバグるのかなーと思ったら、何も実行されずバグりませんでした。

2007/05/08

[coldfusion]空の変数のListLen

は0

例えば、

<cfset form.hoge="">
#ListLen(form.hoge)#

と書いた場合、上のListLenは0を返します。

2007/05/07

[coldfusion]submit時のbuttonボタンのvalueについて

昨日は、submitボタンについてだったのですが、buttonの場合はどうなるかというと、valueは送信されないようです。

<>form name="frm" method="post">
<input type="submit" name="hoge1" value="送信">
<input type="button" name="foo" value="テスト">
</form>

仮に上のように組んで送信を押しても、「テスト」というvalueは送信されないみたいです。

ソースを組んでいるときに、ついつい忘れてしまうので、注意したいところです。

2007/05/06

[coldfusion]submit時のsubmitボタンのvalueについて

最近知ったのですが、submitボタンを押した時、submitボタンのvalueも送信されるみたいです。


<form name="frm" method="post">
<input type="submit" name="hoge1" value="送信">
</form>

上のような場合、送信ボタンを押した後、「送信」というvalueも一緒に送信されるみたいです。

では、下の場合、
<form name="frm" method="post">
<input type="submit" name="hoge1" value="送信1">
<input type="submit" name="hoge2" value="送信2">
</form>

上の場合、片方を押すと、押されなかったボタンに関してのvalueは送信されないみたいです。

つまり、「送信1」のボタンを押すと「送信2」が、「送信2」を押すと「送信1」が送信されないということになります。

JavaScriptで入力チェックをかけず、そのままsubmitしたい場合に便利かもしれません。

2007/05/05

[coldfusion]cfmoduleは、2度呼ばれる??

最近、知って、びっくりしたのですが、cfmoduleって2度呼ばれることがあるんですね。

例えば、

<CFMODULE TEMPLATE="hoge.cfm">



だと、cfmoduleは、一回しか、コールされないのですが、

<CFMODULE TEMPLATE="hoge.cfm">
</CFMODULE>

だと、なんと、hoge.cfmは、2回コールされるのです。

また、こう呼び出しても、2回コールされます。

<CFMODULE TEMPLATE="hoge.cfm" />

仮に、hoge.cfmの中身が下だったとします。

Hello ColdFusion<BR>

すると実行したとき、下のように表示されます。

Hello ColdFusion
Hello ColdFusion

ここで、cfmoduleが呼び出されたときに、hoge.cfm内のthisTag.ExecutionModeは、'start'になって、終了タグで呼び出された場合、thisTag.ExecutionModeの値は、'end'になります。

したがいまして、hoge.cfmが
Hello ColdFusion
<BR>
<CFIF thisTag.ExecutionMode is "start">
this tag is start!!<BR>
</CFIF>
<CFIF thisTag.ExecutionMode is "End">
this tag is end!!<BR>
</CFIF>

の場合、終了タグを使ったcfmoduleの呼び出し結果は、

Hello ColdFusion
this tag is start!!
Hello ColdFusion
this tag is end!!

となります。

ちなみに、呼び出し元が、

<CFMODULE TEMPLATE="hoge.cfm">
  foo
  <BR>
</CFMODULE>

となっていた場合、表示結果は、

Hello ColdFusion
this tag is start!!
foo
Hello ColdFusion
this tag is end!!

となります。

このことから、cfmoduleでは、一度、呼び出し先を処理して、それから、終了タグにいきつくまで、呼び出し元のcfmodule間の処理を行い、終了タグついた時に、再度、呼び出し先をコールするということなんですね。

2007/05/04

[coldfusion]form変数からqueryを作る。

先輩社員から教えていただいて、大変重宝している技。

しばしばあることなのですが、cfqueryでクエリーを発行し、画面に表示した後、画面上で何かしらの動作(チェックボックスにチェックをいれたり、ラジオボタンを選択したりした後など。)して、submitした後、遷移先のページでform変数を表示したい場合、一回、coldfusionでform変数からクエリーを作ってから表示する場合があります。

例えば、submitした後、各form変数の構造体が下のような形であるとします。

<CFSET Form.Name = "Taro">
<CFSET Form.BirthDay = "19821123">
<CFSET Form.BloodType = "O">
<CFSET Form.Address = "TOKYO">
<CFSET Form.E_MailAddress = "hoge1+test@gmail.com">
<CFSET Form.Sex = "M">
<CFSET Form.CellPhone_Number = "090-****-****">

で、この後、queryNewを作って何もないクエリーを生成し、カラム名を追加していきます。

<CFSET Q_Main = QueryNew("")>
<CFSET col_list = "">
<CFSET col_list = ListAppend(col_list,"Name")> <!--- 名前 --->
<CFSET col_list = ListAppend(col_list,"BirthDay")> <!--- 生年月日 --->
<CFSET col_list = ListAppend(col_list,"BloodType")> <!--- 血液型 --->
<CFSET col_list = ListAppend(col_list,"Address")> <!--- 住所 --->
<CFSET col_list = ListAppend(col_list,"E_MailAddress")> <!--- emailアドレス --->
<CFSET col_list = ListAppend(col_list,"Sex")> <!--- 性別 --->
<CFSET col_list = ListAppend(col_list,"CellPhone_Number")> <!--- 携帯電話番号 --->
<CFSET Q_Main = QueryNew("#col_list#")>

追加した後、空のレコードを生成し、listループで、フィールドに値をセットします。

<CFSET QueryAddRow(Q_Main)>
<CFLOOP INDEX="col" LIST="#Q_Main.columnlist#">
  <CFSET QuerySetCell(Q_Main, "#col#", Evaluate("Form.#col#"))>
</CFLOOP>

するとあ~~~ら不思議、cfqueryで、ループをまわすことができます。

<CFOUTPUT>
  <TABLE border="1">
    <TR>
      <TD>Name</TD>
      <TD>BirthDay</TD>
      <TD>BloodType</TD>
      <TD>Address</TD>
      <TD>E_MailAddress</TD>
      <TD>Sex</TD>
      <TD>CellPhone_Number</TD>
    </TR>
    <TR>
      <CFLOOP query="Q_Main">
        <TD>#Name#</TD>
        <TD>#BirthDay#</TD>
        <TD>#BloodType#</TD>
        <TD>#Address#</TD>
        <TD>#E_MailAddress#</TD>
        <TD>#Sex#</TD>
        <TD>#CellPhone_Number#</TD>
      </CFLOOP>
    </TR>
  </TABLE>
</CFOUTPUT>

実行結果は、下のようになります。

NameBirthDayBloodTypeAddressE_MailAddressSexCellPhone_Number
Taro19821123OTOKYOhoge1+test@gmail.comM090-****-****

まるでselect文から取得したような気持ちで使うことができるでめっちゃ重宝しています。

今までの流れをまとめました。

<CFSET Form.Name = "Taro">
<CFSET Form.BirthDay = "19821123">
<CFSET Form.BloodType = "O">
<CFSET Form.Address = "TOKYO">
<CFSET Form.E_MailAddress = "hoge1+test@gmail.com">
<CFSET Form.Sex = "M">
<CFSET Form.CellPhone_Number = "090-****-****">

<CFSET Q_Main = QueryNew("")>
<CFSET col_list = "">
<CFSET col_list = ListAppend(col_list,"Name")> <!--- 名前 --->
<CFSET col_list = ListAppend(col_list,"BirthDay")> <!--- 生年月日 --->
<CFSET col_list = ListAppend(col_list,"BloodType")> <!--- 血液型 --->
<CFSET col_list = ListAppend(col_list,"Address")> <!--- 住所 --->
<CFSET col_list = ListAppend(col_list,"E_MailAddress")> <!--- emailアドレス --->
<CFSET col_list = ListAppend(col_list,"Sex")> <!--- 性別 --->
<CFSET col_list = ListAppend(col_list,"CellPhone_Number")> <!--- 携帯電話番号 --->
<CFSET Q_Main = QueryNew("#col_list#")>
<CFSET QueryAddRow(Q_Main)>

<CFLOOP INDEX="col" LIST="#Q_Main.columnlist#">
  <CFSET QuerySetCell(Q_Main, "#col#", Evaluate("Form.#col#"))>
</CFLOOP>

<CFOUTPUT>
  <TABLE border="1">
    <TR>
      <TD>Name</TD>
      <TD>BirthDay</TD>
      <TD>BloodType</TD>
      <TD>Address</TD>
      <TD>E_MailAddress</TD>
      <TD>Sex</TD>
      <TD>CellPhone_Number</TD>
    </TR>
    <TR>
      <CFLOOP query="Q_Main">
        <TD>#Name#</TD>
        <TD>#BirthDay#</TD>
        <TD>#BloodType#</TD>
        <TD>#Address#</TD>
        <TD>#E_MailAddress#</TD>
        <TD>#Sex#</TD>
        <TD>#CellPhone_Number#</TD>
      </CFLOOP>
    </TR>
  </TABLE>
</CFOUTPUT>

2007/05/03

[coldfusion]submit時、空のhiddenも定義される。

最近、びっくりしたことなのですが、submit前のhtmlでvalue=""のhiddenがあったとして、遷移先にsubmitを行うと、なんと、なんと、hiddenのvalueも引き継がれるんですね。

例えば、


<FORM name="FRM_MAIN" action="" method="post">
  <INPUT type="hidden" value="" name="hoge">
  <INPUT type="submit" value="Run">
</FORM>

みたいのがあったとして、submitを押すと、hidden(上の場合は、hoge)は、遷移先上のIsDefinedファンクションをtrueで返してしまうんですね。

遷移先のページが、

<CFIF IsDefined("Form.hoge")>
  <CFOUTPUT>@#hoge#@</CFOUTPUT>
</CFIF>

だとした場合、trueとなってしまうので、html上で、@@と表示されます。

ちょっと盲点だと思ったので、書き留めました。

2007/05/02

[coldfusion]submit時のcheckboxの値について

htmlのINPUT typeがcheckboxの場合、submit時にチェックをいれておかないと、その値を保持できないみたいです。

例えば、

<FORM name="FrmMain" action="" method="post">
  <INPUT type="checkbox" name="hoge" value="1">
  <INPUT type="submit" value="Run">
</FORM>

があったとして、submitすると、遷移先のページにチェックボックスの値を送信してくれます。

ちなみに、上の場合、チェックが入っていると、1を送信し、チェックを入れていないと、「要素 HOGE は FORM 内で未定義です。」というエラーを返します。

2007/05/01

ブログ開設しました。

初めまして、maitoと申します。

この度、Bugle Diaryを開設しました。

2006年4月から仕事でadobeのcoldfusionを使い始め、その間、JavaScript、oracle、aspなど、いろいろ触っているのですが、物忘れが激しくプレッシャーに弱いので、製造中にテンパっちゃってます。。。

orz

そんな気持ちを奮い立たせて、プログラムのことについて、ざっくばらんに書いていきたいと思います。