2013-06-11 25 views
1

編輯:問題是重複的,但ANSWER不是!ColdFusion - 嵌套變量(動態變量讀取)

我有以下代碼:

<cfquery name="contact" datasource="thesource"> 
    SELECT * FROM #table# WHERE foo = '#bar#' 
</cfquery> 

再後來就(這是問題的一部分):

<cfloop from="0" to="9" index="i"> 
    <cfset thisvar = Evaluate("contact.check" & i) /> 
    <cfoutput> 
    #thisvar# 
    </cfoutput> 
</cfloop> 

在執行時,它拋出一個漂亮的大「變contact.check0是未定義」。但是,如果硬編碼,#contact.check0#將輸出很好。

有關如何解決此問題的任何想法?

說明: 我看過Coldfusion - variable field name when looping through database query results,雖然問題看起來完全一樣,但解決方案不起作用。根據評論,我也得到一個「不能轉換爲數字」的錯誤。我注意到托馬拉克提到「有點捉襟見肘」,但從來沒有說過它是什麼。在他鏈接到的文章中,我已經嘗試過每一種語法上相同的形式,並且它都會引發錯誤......無法轉換爲數字或者未定義。

此外,我知道Evaluate()有開銷和「不應該使用」。我會採取任何可行的解決方案,無論它是否具有評估功能。

這是ColdFusion的9

謝謝

編輯:而類似的問題已經有了答案,這個問題有不同的原因。見下面的接受答案。

+2

您引用的鏈接中的正確答案應該有效。產生「無法轉換爲數字」錯誤的代碼是什麼? –

+0

同意,該答案中的代碼將正常工作,假設您的查詢包含列名「check0,... check9」。 * RE:我注意到Tomalak提到「有點捉摸」,但從來沒有說過它是什麼*是的他做到了。他說:「當使用」尖括號「-syntax訪問Query對象時,您必須追加(從1開始)行號索引」ie queryName [「columnName」] [rowNumber]''。 – Leigh

+0

你在名爲'check0'的查詢中有一列嗎? –

回答

3

這是可笑和荒謬的完全相同的副本。工作代碼(移動了一下週圍的東西):

<cfoutput> 
    <cfloop from="0" to="9" index="i"> 
    <cfset thisvar = contact["check"&i][1] /> 
    #thisvar# 
    </cfloop> 
</cfoutput> 

不工作代碼:

<cfoutput query="contact"> <!--- this line here ---> 
    <cfloop from="0" to="9" index="i"> 
    <cfset thisvar = contact["check"&i][1] /> 
    #thisvar# 
    </cfloop> 
</cfoutput> 

別人已經把整個頁面各處CFOUTPUT標籤。雖然這通常不會成爲問題,但他們也會聲明查詢屬性。這以某種方式覆蓋了來自數據庫的原始查詢。調用contact.check0工作得很好,但動態構建變量名稱,我想,試圖引用cfoutput的查詢屬性。

感謝Peter Boughton提出瞭解決問題代碼的建議......這讓我意識到了這一點,並且Simon發佈了語法正確的代碼。點數交給他們。

+1

這當然很奇怪。也許'contact [「check」&i] [contact.CurrentRow]'可以在中工作,但是如果你只需要1行,你無需循環查詢,所以它的工作方式就足夠了:) –

+1

* ..把cfoutput標籤放在整個頁面上..他們還聲明瞭查詢屬性。* Hm ..但是不允許嵌套兩個「查詢」輸出,所以它聽起來像是在那裏仍然是一塊失蹤。如果你仍然有完整的提取/再生案例,我會好奇的看到它,因爲我從來沒有遇到過這個問題。 – Leigh

+0

其實現在你提到它了,我以前遇到過問題,其中''觸發了一個編譯錯誤。儘管如此,我無法記得100%是在CF9還是Railo。 –

6

首先,關於逃逸輸入的標準blub。 cfqueryparam存在的原因。除此之外,你可以做這個沒有評估。試試這個代替,包括檢查,以確保真正有結果

<!--- make sure that there is actually a result ---> 
<cfif contact.RecordCount EQ 0> 
    NO RESULT 
<cfelse> 
    <cfloop from="0" to="9" index="i"> 
     <!--- assumes that you want row 1 ---> 
     <!--- check.CurrentRow could also be used instead of 1 ---> 
     <cfset thisvar = contact['check'&i][1] /> 
     <cfoutput> 
     #thisvar# 
     </cfoutput> 
    </cfloop> 
</cfif> 

我懷疑它正試圖評估列沒有行號的規格,而當硬編碼它,你會發現它使用當前行。

編輯丹Bracuk指出,這是你在你的問題鏈接的問題,Coldfusion - variable field name when looping through database query results

+0

* ...嘗試評估沒有指定行號的列*是的,但是在CF9中,contact.check0應該快速切換到查詢的第一行中的值。所以它不應該拋出一個未定義的錯誤 - 除非在運行查詢之後''contact'變量被其他值*覆蓋了嗎? FWIW,無論哪種方式,它都適用於我的CF/CF9。 – Leigh

+0

在最新版本的CF中,該邏輯沒有改變。我期望contact.check0 [1]或contact.check0.1可能正確評估。我同意這感覺有點不一致 - 但是,然後再次有其他更好的方式來實現你的目標,如這裏和那裏所示 –

+0

@ Simonatmso.net:我複製並粘貼你的代碼。我得到一個「值check0不能轉換爲數字」。另外,爲了記錄,我沒有在頂部寫數據庫查詢,所以我不想去碰它。 @Leigh:我會再次檢查以確保'contact'沒有被覆蓋,但是由於現有的代碼已經工作(我們只是試圖使它在將來更加可擴展),我不認爲它是改變。不過,我會再看一遍。 –