ColdFusionを使用していて、特定のアカウントの特定の列の値を取得できるようにしようとしています(各アカウントは、行)。クエリ列がcfqueryparam変数であるときにcfqueryから単一の出力を取得する
このような機能が正常に動作します:
<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>
しかし、私は実際に欲しいのは私がからの読み取りにどの列名を指定することができる機能である、とほとんど同一のCFの束を作るための必要性を排除別のハードコードされたSELECTパラメータを持つ関数です。私はそれがこのようなものに見えるべきだと思っていますが、私はそれが復帰しているはずだと信じている単一の文字列を実際に読むのに問題があります。
<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>
私はあなたが誰かがcommentでそれを言及しているためgetColumn[#columnName#]
またはgetColumn[columnName]
のようなブラケット表記で変数を使用することができましたことを考えました。しかし、自分で変数を使用しようとすると、期待通りに機能しませんでした。
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.
私はcfqueryタグの単一の結果を取得したいとき、私が取るべきルート任意のアイデアを、私は私のSELECT部分にハードコーディングされた列名を使用していない:私はこのエラーを取得しますクエリ?通常、このプロセスは非常に簡単ですが、列名が変数である場合は少し違うように見えます。
* cfqueryparamを使用して、選択する列名を指定しようとしています*あなたはそうすることはできません。 CFQueryparamは、リテラルでのみ使用でき、SQLコマンドとして評価する必要のあるもの(表名や列名など)では使用できません。 – Leigh
これは問題の一部であり、技術的には、cfNameのcfargumentは別のサーバー側の関数で指定するものなので、cfqueryparamが提供するSQLインジェクションの保護は必要ありません。私はそれが私が書いた何か有効なものであることを知っているので、入力をきれいにする必要はありません。 – Ectropy
あなたが提案した 'cfqueryparam'を削除し、'#変数# 'で置き換え、Mark A Krugerの括弧表記の使い方の修正例を使用しました。それは期待どおりに動作しているようです!私は将来的に人々を助ける場合に備えて、私が最後に持っているものを投稿します。 – Ectropy