2009-06-30 22 views
7

Ho un set di nomi di colonne in una tabella, ad es. foo1, foo2, foo3, foo4. Io voglio fare riferimento a questi nomi di colonna in modo dinamico attraverso un ciclo:Coldfusion: nome del campo variabile durante il looping dei risultati delle query del database

<cfloop index="i" from="1" to="4"> 
    <cfset foo = Evaluate("query.foo" & i)> 
</cfloop> 

È possibile che questo non funziona - ColdFusion genera un errore "variabile non definito", anche se query.foo1 è un riferimento valido per il risultati delle query. In quale altro modo posso fare questo?

risposta

21

Non utilizzare Evaluate() per cose del genere! È lento e should be avoided.

<cfloop index="i" from="1" to="4"> 
    <cfset foo = query["foo" & i][query.CurrentRow]> 
</cfloop> 

Oppure, se ti piace:

<cfloop index="i" from="1" to="4"> 
    <cfset foo = query["foo#i#"][query.CurrentRow]> 
</cfloop> 

Evaluate() è per valutare pezzi di codice. Non usarlo per cose che possono essere risolte in modo più elegante in modi linguistici e più appropriati.

EDIT:

Quando si accede Query oggetti con il -syntax "angolo di staffa", è necessario aggiungere l'indice numero (1-based) righe (query["foo#i#"][RowNum]). Quando si utilizza la tradizionale "punto" -sintassi (query.foo1), la riga corrente è implicita.

Per accedere esplicitamente alla riga corrente, utilizzare la proprietà QueryObject.CurrentRow. Ma potrebbe essere qualsiasi intero positivo fino a QueryObject.RecordCount. Si consiglia un controllo dell'intervallo diverso da CurrentRow.

Questo apre un campo interessante: È possibile iniziare a utilizzare oggetti di query con "accesso casuale". Precedentemente (prima di CFMX) tutto quello che potevi fare era iterarli dall'inizio alla fine, tirando fuori le cose che cercavi. Ora è come una struttura di dati struct/array annidata che puoi usare in modi diversi.

+0

Sfortunatamente, nessuno di questi lavori - ColdFusion mi dice "il valore foo1 non può essere convertito in un numero". – ClairelyClaire

+0

Oh, capisco. Aspetta, c'è un piccolo problema su come indirizzare le righe di query con la sintassi della parentesi angolare. – Tomalak

+0

Non riesco a vederlo nella documentazione a cui sei collegato - qualche suggerimento? – ClairelyClaire

2

Sei molto vicino. Prova questo:

<cfset query.foo1 = "foo val 1"> 
<cfset query.foo2 = "foo val 2"> 
<cfset query.foo3 = "foo val 3"> 
<cfset query.foo4 = "foo val 4"> 

<cfloop index="i" from="1" to="4"> 
     <cfset foo = Evaluate("query.foo#i#")> 
     <cfoutput>#foo#<br></cfoutput> 
</cfloop> 
+8

So che Evaluate() è stato usato tradizionalmente (vale a dire fino a CF5) per questo tipo di cose, ma dal momento che CF6 non è necessario e generalmente non è raccomandabile. Persino Macromedia/Adobe scoraggiano il suo utilizzo: http://livedocs.adobe.com/coldfusion/7/htmldocs/00000946.htm – Tomalak

+0

Impressionante, non me ne sono reso conto. Grazie. –

Problemi correlati