2017-02-23 7 views
1

フォームを送信すると、ユーザーが選択した値をフォームに保存します。ページのフォームの値を維持する

これは私が試したものです:

<cfset tx_name = ""> 
<cfset id_age1 = ""> 

<cfif isDefined("form.tx_name")> 
    <cfset tx_name = form.tx_name> 

    <cfif isDefined("a1")> 
     <cfset id_age1 = form.a1> 
    </cfif> 
</cfif> 

<cfoutput> 

<input type="text" name="tx_name" value="#tx_name#"> 

<select name="id_age1"> 
    <cfloop from="1" to="20" index="a1"> 
     <option value="#a1#">#a1#</option> 
    </cfloop> 
</select> 

</cfoutput> 

しかし私は、id_age1は正しい結果が表示されていない、tx_nameために期待される結果を取得しています。それは1にリセットされます。私は間違って何をしていますか?

答えて

4

ほとんどのコードは不要です。存在しない変数(空でない変数)のデフォルト値を定義するには、単にcfparamを使用します。スコープの競合に予期しない結果を避けるために、変数のスコープを指定してください:

<cfparam name="form.tx_name" default=""> 
    <cfparam name="form.id_age1" default=""> 

<select>リスト内の項目を事前に選択するには、apply the selected attribute to the appropriate <option>次の条件を満たす必要があります。また

<select name="id_age1"> 
    <cfloop ...> 
     <option value="#a1#" <cfif a1 eq form.id_age1>selected</cfif>> 
     #a1# 
     </option> 
    </cfloop> 
</select> 

場合、わかりません意図的に省略されていましたが、2つのフォームフィールドは<form>タグ内にネストされていなければなりません。

+0

これは、が選択されたで試しましたが、これはうまくいきました。ありがとうございました。 – gosi123

+2

@ gosi123 - 偶発的なスコープの競合を避けるため、変数のスコープを改善する、つまり 'form.id_age1'を改善する。複数のスコープで同じ変数名を作成することは可能です。例 'variables.something'と' form.something'です。場合によっては予期しない結果につながる可能性があります。変数をスコープすると、その可能性が低くなります。 – Leigh

+1

変数がどこから来たのか正確に読めるので、読みやすくなります。 –

2

私はこれがコメントであることは知っていますが、答えとして読むのは簡単です。

入力コードは安全ではありません。これはHTMLインジェクションの対象です。参照:

<cfparam name="form.tx_name" default=""> 
... 
<input type="text" name="tx_name" value="#EncodeForHTMLAttribute(tx_name)#" /> 

ColdFusionには、これに対処する一連の機能があります。参照:http://blogs.adobe.com/security/2014/05/coldfusion-11-enhances-the-security-foundation-of-coldfusion-10.html

+0

うん、良い点。 – Leigh

関連する問題