Ich verwende ColdFusion und versuche eine Funktion zu erstellen, mit der ich den Wert einer bestimmten Spalte in einem bestimmten Konto abrufen kann (jedes Konto ist sein eigener Datensatz/Reihe).Abrufen einer einzelnen Ausgabe von cfquery, wenn die Abfragespalte die Variable cfqueryparam ist
Eine Funktion wie das funktioniert gut:
<cffunction name="getColumnValueFromAccount" access="public" returntype="string" >
<cfargument name="accountName" type="string" required="yes" />
<cfquery name="getColumn" datasource="mydatasource">
<!--- Note that the line below is 'hard-coded.' --->
SELECT role_ExampleSystem
FROM table_name
WHERE (accountName = <cfqueryparam cfsqltype="cf_sql_varchar" maxlength="50" value='#accountName#'>)
</cfquery>
<!--- It's easy to return the column value when you know what its name was. --->
<cfreturn getColumn.role_ExampleSystem >
</cffunction>
Aber was ich eigentlich will, ist eine Funktion, die mir die Spaltennamen lesen aus, und beseitigt die Notwendigkeit für die Herstellung eine Reihe von nahezu identischen CF angeben kann, Funktionen, die nur einen anderen fest codierten SELECT-Parameter haben. Ich denke, es sollte ungefähr so aussehen, aber ich habe Probleme, die einzelne Zeichenfolge zu lesen, von der ich glaube, dass sie zurückkehren sollte.
<cffunction name="getColumnValueFromAccount" access="public" returntype="string" >
<cfargument name="accountName" type="string" required="yes" />
<!--- Trying to accept a column name as an argument --->
<cfargument name="columnName" type="string" required="yes" />
<cfquery name="getColumn" datasource="mydatasource">
<!--- I'm trying to use cfqueryparam to add specify the column name to select. --->
SELECT <cfqueryparam cfsqltype="cf_sql_varchar" maxlength="50" value='#columnName#'>
FROM table_name
WHERE (accountName = <cfqueryparam cfsqltype="cf_sql_varchar" maxlength="50" value='#accountName#'>)
</cfquery>
<!--- This line doesn't work. --->
<cfreturn getColumn[#columnName#] >
</cffunction>
Ich dachte, dass Sie in der Lage waren, in einer Klammer-Notation Variablen verwenden wie getColumn[#columnName#]
oder getColumn[columnName]
, weil jemand es in einem comment erwähnt. Aber wenn ich versucht habe, Variablen selbst zu verwenden, hat es nicht wie erwartet funktioniert. Ich bekomme diese Fehlermeldung:
The value returned from the getColumnValueFromAccount function is not of type string. If the component name is specified as a return type, it is possible that either a definition file for the component cannot be found or is not accessible.
Jede Idee, welchen Weg ich soll, wenn ich das einzige Ergebnis eines cfquery erhalten möchten, aber ich bin nicht eine hartcodierte Spaltennamen in der SELECT-Teil meiner Verwendung Abfrage? Normalerweise ist dieser Prozess sehr einfach, aber wenn Ihr Spaltenname eine Variable ist, werden die Dinge etwas anders.
* Ich versuche cfqueryparam zu verwenden, um den zu wählenden Spaltennamen anzugeben. * Dies ist nicht möglich. CFQueryparam kann nur für Literale verwendet werden, nicht für Dinge, die als SQL-Befehle ausgewertet werden müssen - wie Tabellen- oder Spaltennamen. – Leigh
Das könnte Teil des Problems sein, und technisch brauche ich nicht den SQL-Injection-Schutz, den cfqueryparam bietet, weil das cfargument für columnName etwas ist, das ich in einer anderen serverseitigen Funktion angegeben habe. Keine Notwendigkeit, die Eingabe zu reinigen, weil ich weiß, dass es etwas sein wird, das ich geschrieben habe. – Ectropy
Ich habe das 'cfqueryparam' entfernt, wie Sie es vorgeschlagen haben, und es durch eine '# variable #' ersetzt. Dann habe ich Mark A Krugers korrigiertes Beispiel für die Verwendung der Klammernotation verwendet. Es sieht so aus, als ob es wie erwartet funktioniert! Ich poste, was ich am Ende für den Fall habe, dass es den Menschen in der Zukunft hilft. – Ectropy