さて、今回ご紹介するエラー・症例は、若き頃の筆者さんが体験したお話です。
ColdFusionをまだ覚えたばかりの頃、見よう見まねでデータベースから取得したデータを画面に表示するプログラムを書いたそうです。でも、プログラムを実行すると、画面には、「復号 object 型を単純値に変換できません」というエラーが。。。なぜ、こんなエラーが起こってしまったのでしょうか?画面に表示されたメッセージを確認してみましょう。
次の情報は、Web サイト開発者のデバッグに役立ちます。 | |||||||
リクエストを処理する際に、エラーが発生しました。 | |||||||
|
その時に書いたプログラムを要約したものをご紹介します。皆さま、エラーの原因、お気づきでしょうか?
<cfquery datasource="cfartgallery" name="qArt"> SELECT * FROM ART </cfquery> <cfoutput query="#qArt#"> #qArt.ArtName# </cfoutput>
エラーメッセージに書かれている「複合object型」とは、文字列や数字といったテキストとは違い、クエリオブジェクト(クエリ変数)や、配列・構造体、その他オブジェクトと呼ばれるデータの集合体を指します。
それぞれの object 型に応じた呼び出し方があり、例えばクエリオブジェクトの場合は「<cfoutput query="クエリ名">〜</cfoutput>」で囲って、その中で「#クエリ名.列名#」と書いて値を呼び出しています。
エラーメッセージを見ると「この式は変数または遷移式結果を単純値として 要求しましたが、その結果を単純値に変換 できません」と書かれています。変数の値に「複合object型」が格納されているのに、文字列や数字のような呼び出し方をした(クエリオブジェクト qArt を <cfoutput>#qArt#</cfoutput>のように呼び出した)ためエラーになってしまいました。
さて、肝心の原因となる箇所は、皆さまお気づきだと思いますが、<cfoutput query="#qArt#">と query属性に指定するクエリ名(qArt)に#で囲った事が原因です。#qArt#と書いてしまったので、クエリ名ではなく、クエリオブジェクトの中身(値)を見に行ってエラーになったためです。
<cfoutput>のquery属性の「#qArt#」を「qArt」に変更して、本来の利用したいクエリオブジェクトの“名前”を指定すれば、このエラーは解消します。
原因が分かれば簡単な事ですが、慣れないうちは、変数には#を付けるものと思いこんでしまってなかなか原因が気付かない事も確かです。
同じような間違いには、変数の存在確認をするIsDefined()関数で、存在を確認したい変数の“名前”を指定すべき所を、つい、変数を記述する時のクセで#を付けてしまって、「#IsDefined("#a#")#」と書いてしまい「変数Aが未定義」エラーなどの原因となります。
同じような失敗をしないよう、変数を利用する際、変数の値を指すのか、あるいは変数の名前を指定するのか、などを確認してプログラムしていくと良さそうですね。
実は、上記で紹介したエラーは古いColdFusionのバージョンで表示されます。
ColdFusion 11や10では、エラーメッセージが改善されていて、具体的な内容(下記)になっているので、前より分かり易くなっていました。もしかしたら、筆者のような体験をした人が多かったのかもしれませんね。
次の情報は、Web サイト開発者のデバッグに役立ちます。 | |||||||
リクエストを処理する際に、エラーが発生しました。 | |||||||
|