Получение ошибки сложного объекта при попытке вывести значения запроса - PullRequest
6 голосов
/ 09 марта 2012

Моя цель - просто вывести данные столбца, указанные в «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>

Разве это не должно работать без ошибки? Я чувствую, что просто упускаю из виду что-то простое, я просто нигде не могу найти ответ.

1 Ответ

8 голосов
/ 09 марта 2012

Хорошо, я вижу, вы исправили свой исходный код, поэтому вот мой ответ:

Вы просматриваете список столбцов и пытаетесь оценить каждый столбец, как если бы он был единственным элементом в структуре.

Однако запрос немного отличается: к нему обращаются в виде последовательности структур, которые, в свою очередь, являются массивами - каждой строки данных, возвращаемой из запроса.

Если вы хотите вывести все строки данных, не зная заранее столбцов (или передавая их динамически, как вы подразумеваете в приведенном выше коде), попробуйте следующее:

<cfoutput query="myQuery">
  <cfloop list="#myQuery.ColumnList#" index="thisColumn">
    #myQuery[thisColumn][myQuery.CurrentRow]#
  </cfloop>
</cfoutput>

Это предоставит вам необходимую информацию. Внешний cfoutput с атрибутом запроса будет перебирать все строки полученных вами данных. Затем для каждой строки вы перебираете список столбцов, создаваемых запросом, и для каждого столбца выводите данные, указывая строку через myQuery.CurrentRow, которая автоматически выполняет итерации для вас через внешний вывод.

Я бы также воспользовался моментом, чтобы рекомендовать вам избегать циклов внутри циклов и просто выводить свои значения явно:

<cfoutput query="myQuery">
  #company# #phone#
</cfoutput>

Использование этого синтаксиса немного дешевле, чем вышеупомянутый цикл внутри цикла.

...