1

私の会社は ColdFusion を使用しており、何年にもわたってさまざまなバリエーションでこの問題を抱えています。それを解決する時が来ました。

シナリオは非常に単純です。

<cfparam name="session.check" default="0">
<cfif NOT isDefined('session.check') OR 
      session.check IS 0>
    <cfset ok=1>
</cfif>

ColdFusion がエラーをスローするようになりました。

要素 CHECK は SESSION で定義されていません。18行目でエラーが発生しました。

そこから何かを読み取ることができる人のために、詳細なスタック トレースを次に示します。

coldfusion.runtime.UndefinedElementException: 要素 CHECK が SESSION で未定義です。coldfusion.runtime.CfJspPage.resolveCanonicalName(CfJspPage.java:1694) で、coldfusion.runtime.CfJspPage._resolve(CfJspPage.java:1612) で、coldfusion.runtime.CfJspPage._resolveAndAutoscalarize(CfJspPage.java:1747) で、coldfusion.runtime で。 CfJspPage._resolveAndAutoscalarize(CfJspPage.java:1740) at cfindex2ecfm123677868._factor9(C:\path\index.cfm:18) at ...

cfparam を使用するか、単に cfset を使用するかは問題ではありません。また、これは単純化された例ではなく、まさにこのエラーがサーバーで発生しました。変数の設定と読み取りの間に単一の行はありません。

ColdFusion 8.0.1.195765 を実行しています。何か案は?

前もって感謝します!

4

4 に答える 4

1

structKeyExistsの代わりに使用してみてくださいisDefined

<cfif NOT structKeyExists(session, 'check') OR 
      session.check IS 0>
    <cfset ok=1>
</cfif>
于 2012-04-22T19:33:49.180 に答える
1

ここに 2 つの推測があります.... まず、間違った行番号にだまされるかもしれません。18 行目より上 (スタックまたは実行順序に貼り付けたコードの上) を見てください。別の「チェック」リファレンスを探します。

一方、このコード:

<cfparam name="session.check" default="0">
<cfif NOT isDefined('session.check') OR 
      session.check IS 0>
    <cfset ok=1>
</cfif>

わかりましたが...「NOT isDefined( 'session.check')」が含まれています...これは、その前にcfparamがあれば不要です。Cfparam はvar が存在することを保証する必要があるため、「isDefined」は必要ありません。エラーが原因で挿入されたものと思われます。

推測番号 2

アプリケーションによっては、特にフレームや ajax を使用している場合、これはある種の競合問題になる可能性もあります。セッション スコープの CFLOCK でコードを囲んでみてください。

<cflock scope="session" timeout="4">
   <cfparam name="session.check" default="0">
   <cfif NOT isDefined('session.check') OR 
         session.check IS 0>
       <cfset ok=1>
   </cfif>
</cflock>

これにより、このコードが変更されていないセッションで実行されることが保証されます。セッションにヒットする可能性のある他のコードについては保証されません。

于 2012-04-23T14:45:36.187 に答える
0

CFApplication 名がユニークで独特であることを確認してください。ベスト プラクティスでは通常、これを確実にするために現在のディレクトリをハッシュすることになりますが、バージョン番号を追加して確実に確認することもできます。例えば:

<CFAPPLICATION name="myApp_0001_#hash(getCurrentTemplatePath())#">

常に再起動している問題のあるサーバーもセッションをドロップする可能性がありますが、前の理由がおそらくこれの最も一般的な原因です...特に共有ホスティング環境では.

于 2012-04-23T18:02:00.977 に答える
0

セッションのタイムアウトを宣言する必要がありますか? これは12時間でタイムアウトします...

 <!--- Create the application --->
 <cfapplication name="MyApp" clientmanagement="Yes"
                sessionmanagement="Yes"
                sessiontimeout="#CreateTimeSpan(0,12,0,0)#"
                applicationtimeout="#CreateTimeSpan(0,12,0,0)#">
        <!--- 
        #CreateTimeSpan(days,hours,minutes,seconds)#
        --->

 <cfparam name="session.check" default="0">  
于 2012-04-22T18:46:47.123 に答える