我的目标是输出“fieldList”中指定的列数据。
收到以下错误:
无法将复杂对象类型转换为简单值。表达式已请求变量或中间表达式结果作为简单值,但是,结果无法转换为简单值。简单值是字符串,数字,布尔值和日期/时间值。查询,数组和COM对象是复杂值的示例。导致错误的最可能原因是您尝试将复杂值用作简单值。例如,您可能尝试在cfif标记中使用查询变量。错误发生在第20行。
尝试执行以下操作时:
<cfquery datasource="retailers" name="myQuery">
Select * FROM retailer
WHERE retailer_id = '#url.id#'
</cfquery>
<cfset fieldList = "company,phone,phone_secondary,fax,email,website">
<cfloop list="#fieldList#" index="i">
#myQuery[i]#
</cfloop>
如果没有给我错误,这不应该工作吗?我觉得我只是忽略了一些简单的事情,我无法在任何地方找到答案。
答案 0 :(得分:8)
好的,我看到你修改了你的初始代码,所以这是我的回复:
您正在循环遍历列列表,并尝试评估每个列,就好像它是结构中的单个元素一样。
然而,查询略有不同:它是作为一系列结构访问的,而这些结构又是数组 - 从查询返回时每行数据。
如果你想输出所有数据行,而不是预先知道列(或者像你在上面的代码中暗示的那样动态传递它们),试试这个:
<cfoutput query="myQuery">
<cfloop list="#myQuery.ColumnList#" index="thisColumn">
#myQuery[thisColumn][myQuery.CurrentRow]#
</cfloop>
</cfoutput>
这将为您提供所需的输出。带有query属性的外部cfoutput将遍历您收到的所有数据行。然后,对于每一行,您遍历查询生成的列列表,并为每列输出数据,通过myQuery.CurrentRow指定行,该行通过外部输出自动迭代。
我现在还花一点时间来提倡你试图远离循环中的循环,只是明确地输出你的值:
<cfoutput query="myQuery">
#company# #phone#
</cfoutput>
使用此语法比循环中的上述循环稍微便宜。