如何在循环查询结果时动态引用列名?
How can I dynamically reference column names while looping through a query's results?
我已经成功编写了一个使用动态变量的 SELECT
语句。它使用页面中的变量来了解从大而杂乱的 table 到 select 的列。它看起来像这样。
<cfquery name="getCapabilityAndDescription" datasource="Stuff">
SELECT [EntryID],
<cfloop list="#JobLevelList#" index="JobLevelIndex">
[#getJobDesc.Type##JobLevelIndex#Capability],
[#getJobDesc.Type##JobLevelIndex#Description],
</cfloop>
[JobID]
FROM [JobCapabilityMatrix]
WHERE JobID = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#URL.JobID#">
AND SkillID = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#URL.SkillID#">
</cfquery>
例如,它动态 select 一个名为 Baker3Description
的列。
但是...我怎样才能动态输出它?我想总结一下,我需要创建一个动态变量,然后将其放入查询的范围内。
到目前为止,我已经尝试过这样设置和调用它:
<cfset DescriptionVariable = #JobTitle# & #JobLevelIndex# & 'Description'>
<cfoutput>
#getCapabilityAndDescription.DescriptionVariable#
</cfoutput>
但它没有按照我想要的方式评估,只是告诉我
Element DESCRIPTIONVARIABLE is undefined in
GETCAPABILITYANDDESCRIPTION.
我知道有一种方法可以从查询中实际 return Baker3Description
的内容,也许使用数组语法?但是我太乱了,需要一点帮助。请感谢。
可以使用结构符号,但还需要查询行号。一般语法是
#queryName[ "columnName" ][ rowNum ]#
<!---
.. or specifically
--->
#getCapabilityAndDescription[ DescriptionVariable ][ 1 ]#
动态输出所有查询列。使用 GetMetaData() 检索查询列属性数组(按 select
顺序)。然后用name
属性输出每一列的值:
<!--- Demo query --->
<cfset yourQuery = queryNew("EntryID,Baker3Description"
, "integer,varchar"
, [[1,"Descrip A"],[2,"Descrip B"]]
)>
<cfset meta = getMetaData(yourQuery)>
<cfoutput query="yourQuery">
<cfloop array="#meta#" index="props">
#yourQuery[props.name][currentRow]#
</cfloop>
<br>
</cfoutput>
尽管要小心构建那种动态 sql。如果用于构建列名的任何值是用户提供的(例如 getJobDesc.Type
),则查询将容易受到 second order sql injection.
的攻击
我已经成功编写了一个使用动态变量的 SELECT
语句。它使用页面中的变量来了解从大而杂乱的 table 到 select 的列。它看起来像这样。
<cfquery name="getCapabilityAndDescription" datasource="Stuff">
SELECT [EntryID],
<cfloop list="#JobLevelList#" index="JobLevelIndex">
[#getJobDesc.Type##JobLevelIndex#Capability],
[#getJobDesc.Type##JobLevelIndex#Description],
</cfloop>
[JobID]
FROM [JobCapabilityMatrix]
WHERE JobID = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#URL.JobID#">
AND SkillID = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#URL.SkillID#">
</cfquery>
例如,它动态 select 一个名为 Baker3Description
的列。
但是...我怎样才能动态输出它?我想总结一下,我需要创建一个动态变量,然后将其放入查询的范围内。
到目前为止,我已经尝试过这样设置和调用它:
<cfset DescriptionVariable = #JobTitle# & #JobLevelIndex# & 'Description'>
<cfoutput>
#getCapabilityAndDescription.DescriptionVariable#
</cfoutput>
但它没有按照我想要的方式评估,只是告诉我
Element DESCRIPTIONVARIABLE is undefined in GETCAPABILITYANDDESCRIPTION.
我知道有一种方法可以从查询中实际 return Baker3Description
的内容,也许使用数组语法?但是我太乱了,需要一点帮助。请感谢。
可以使用结构符号,但还需要查询行号。一般语法是
#queryName[ "columnName" ][ rowNum ]#
<!---
.. or specifically
--->
#getCapabilityAndDescription[ DescriptionVariable ][ 1 ]#
动态输出所有查询列。使用 GetMetaData() 检索查询列属性数组(按 select
顺序)。然后用name
属性输出每一列的值:
<!--- Demo query --->
<cfset yourQuery = queryNew("EntryID,Baker3Description"
, "integer,varchar"
, [[1,"Descrip A"],[2,"Descrip B"]]
)>
<cfset meta = getMetaData(yourQuery)>
<cfoutput query="yourQuery">
<cfloop array="#meta#" index="props">
#yourQuery[props.name][currentRow]#
</cfloop>
<br>
</cfoutput>
尽管要小心构建那种动态 sql。如果用于构建列名的任何值是用户提供的(例如 getJobDesc.Type
),则查询将容易受到 second order sql injection.