7 Stimmen

Coldfusion - variabler Feldname beim Durchlaufen der Datenbankabfrageergebnisse

Ich habe eine Reihe von Spaltennamen in einer Tabelle - z. B. foo1, foo2, foo3, foo4. Ich möchte in einer Schleife dynamisch auf diese Spaltennamen verweisen:

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

Das obige funktioniert nicht - ColdFusion wirft einen "Variable nicht definiert"-Fehler, auch wenn Abfrage.foo1 ist ein gültiger Verweis auf die Abfrageergebnisse. Wie kann ich dies sonst tun?

21voto

Tomalak Punkte 320467

Verwenden Sie nicht Evaluate() für solche Dinge! Es ist langsam und sollte vermieden werden .

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

Oder, wenn Sie möchten:

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

Evaluate() dient der Auswertung von Codebits. Verwenden Sie es nicht für Dinge, die auf elegantere, sprachintegrierte und angemessenere Weise gelöst werden können.

EDIT :

Wenn Sie auf Abfrageobjekte mit der "spitzen Klammer"-Syntax zugreifen, müssen Sie den (1-basierten) Zeilennummernindex ( query["foo#i#"][RowNum] ). Bei Verwendung der traditionellen "Punkt"-Syntax ( query.foo1 ), ist die aktuelle Zeile implizit.

Um explizit auf die aktuelle Zeile zuzugreifen, verwenden Sie die QueryObject.CurrentRow Eigentum. Es könnte aber jede positive ganze Zahl bis zu QueryObject.RecordCount . Eine Entfernungsprüfung wird empfohlen für alles, was nicht CurrentRow .

Dies eröffnet ein interessantes Feld: Sie können nun Abfrageobjekte mit "wahlfreiem Zugriff" verwenden. Früher (vor CFMX) konnte man sie nur von Anfang bis Ende iterieren und die gesuchten Dinge herausziehen. Jetzt ist es wie eine verschachtelte Struktur/Array-Datenstruktur, die Sie auf verschiedene Weise verwenden können.

1voto

Mike Jr Punkte 175

Sie sind sehr nah dran. Versuchen Sie dies:

<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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X