0

ユーザーの追加/編集フォームを作成しています。ページにアクセスすると、現在のユーザーを編集しているか、URL ID で新しいユーザーを追加しているかを検出する if ステートメントがあります。

<cfif isDefined('URL.id')>

<cfquery name="getSquadMember" datasource="#application.datasource#">
SELECT * from squad WHERE id=#URL.id#
</cfquery>
<cfset #name#=#getSquadMember.athlete_name# />



<cfelse>
<cfset SESSION.squad = structNew()>
<cfparam name="SESSION.squad.name" default="">
</cfif>

それは問題ありませんが、セッションまたは値が存在するかどうかを評価する際に問題が発生し、エラーが発生します

<cfinput  class="text" name="name" type="text" id="name" value ="#IIf(IsDefined('name'), DE('#name#'), DE("#SESSION.squad.name#"))#" required="yes"  />

要素 分隊名 はセッションで定義されていません。最初の条件が満たされたときにセッションが存在するかどうかを評価しているのはなぜですか?

ありがとう、

R.

4

4 に答える 4

3

最初に - iif() の使用を避けることができる場合は、そうしてください。それはこれまでに解決したよりも多くの頭痛を引き起こします...

ただし、iif() に関する ColdFusion ドキュメントの次の点に注意してください。

変数が定義されていない場合、ColdFusion はこの関数を処理するときにエラーをスローします。次の例は、この問題を示しています。

#IIf(IsDefined("Form.Deliver"), DE(Form.Deliver), DE("no"))# This returns "Error resolving parameter FORM.DELIVER".

この問題を回避するには、次のようなコードで DE および Evaluate 関数を使用します。

#IIf(IsDefined("Form.Deliver"), Evaluate(DE("Form.Deliver")), DE("no"))# This returns "no"; ColdFusion does not throw an error.

または、CF9 (三項演算子をサポート) を使用している場合:

<cfinput class="text" name="name" type="text" id="name" value ="#IsDefined('name') ? name : SESSION.squad.name#" required="yes" />

于 2011-04-11T09:10:43.340 に答える
0

同じ項目に対して 2 つの異なる変数名が必要な理由はありますか? あなたはただできるでしょうか:

<cfif isDefined('URL.id')>

<cfquery name="getSquadMember" datasource="#application.datasource#">
SELECT * from squad WHERE id=<cfqueryparam value="#URL.id#" cfsqltype="CF_SQL_INTEGER" />
</cfquery>
<cfset name= getSquadMember.athlete_name />

<cfelse>
<cfset squad = structNew()>
<cfset name = "" />
</cfif>
<input type="text" name="name" id="name=" value="#name#" />

これにより、 iff ステートメントの必要性がなくなります

HTH

J

于 2011-04-11T09:00:22.383 に答える
0

いくつかの問題:

1)

<cfquery name="getSquadMember" datasource="#application.datasource#">
SELECT * from squad WHERE id=#URL.id#
</cfquery>

ここで SQL インジェクションを要求しています。cfqueryparam を使用する

2)

<cfset #name#=#getSquadMember.athlete_name# />

# の変な使い方に気づいたのはあなたの 2 番目の投稿です

Jason が書いたとおりのはずです。

<cfset name = getSquadMember.athlete_name />

3)あなたの質問について:

<cfinput class="text" name="name" type="text" id="name" value="#IIf(IsDefined('name'), DE('#name#'), DE("#SESSION.squad.name#"))#" required="yes" />

この方法は実際には読めません。最初に値の変数を設定します。2 つ目 - このように DE に変数を配置する必要はありません。これで十分です。

DE(name)

cfinput を使用しているため、おそらくすべてが正しい必要があります。そして別の問題 - 実際には cfinput を使用する必要はありません。通常の HTML 入力で十分であり、CF の解析をいくらか節約できます。

于 2011-04-11T09:14:33.080 に答える
0

あなたが見ている問題は、IIF() がステートメントのすべての部分を評価しなければならないことです。変数が定義されているかどうかを確認するために実際に使用することはできません。これは、true と false の両方の応答の内容を常に評価しようとするためです。

IIF() を使用するときにこれを念頭に置いている限り、問題なく使用できます。シンプルに保ち、変数が存在しない可能性がある場合は使用しないでください。

あなたのコードの他の問題を指摘するつもりでしたが、他の回答はすでにこれらをカバーする良い仕事をしています。

于 2011-04-11T09:20:17.203 に答える