Получение значения из cfquery, когда столбец запроса является переменной

Я застрял... не могу вспомнить, как это сделать. Код:

<cfquery name = "getsomething>
   select a, b, c
   from d
   where id = '1'
</cfquery>
<cfloop collection="#arguments#" item="argument">
    <cfif #StructFind(arguments, argument)# neq #getsomething.argument[0]#><!--- here's the problem --->
        do something
    </cfif>
</cfloop>

Запрос возвращает одну запись; Мне нужно получить значения каждого столбца для этой записи. Имя столбца является переменной (аргументом). Какой синтаксис мне нужно заменить

 #getsomething.argument[0]#

? Спасибо.


person earachefl    schedule 05.10.2011    source источник


Ответы (1)


Вам нужно сделать пару корректировок:

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

<cfset arguments = StructNew() />
<cfset arguments.a = 'x' />
<cfset arguments.b = 'y' />
<cfset arguments.c = 'c' />

Вы можете видеть, что в данном случае значения не имеют значения — важно то, что, используя аргумент «коллекция», вы работаете со структурой. Несколько некорректно, но давайте двигаться дальше с предположением.

Вы не хотите, чтобы значение ваших аргументов оценивалось динамически, вам нужны ключи — они сопоставляются с вашими столбцами, поэтому зацикливайте так:

<cfloop list="#StructKeyList(arguments)#" index="argument">

тогда работает следующий код:

<cfif StructFind(arguments, argument) neq getsomething[argument][1]>

Обратите внимание, что в этом ответе я изменил индекс вашего запроса с 0 на 1: массивы cfquery отсчитываются от 1, поэтому первая строка не [0], а [1].

person Shawn Holmes    schedule 05.10.2011
comment
Отлично спасибо. На самом деле я пробовал это раньше и получил, что таблица не индексируется из-за ошибки FIELDNAMES, которая меня сбила с толку - я забыл, что arguments.fieldnames существуют. - person earachefl; 05.10.2011
comment
@earachefl - К вашему сведению, подойдет цикл collection или list. Как продемонстрировал Шон, ключом к тому, чтобы все заработало, является использование нотации массива для вашего запроса. (Хотя вы можете захотеть убедиться, что запрос не пуст, чтобы избежать другой ошибки.) Сообщение not indexable... обычно представляет собой загадочный способ сказать, что имя столбца не существует в вашем запросе. - person Leigh; 05.10.2011
comment
Очень странно видеть здесь StructFind. Проще сделать: <cfif Arguments[argument] NEQ GetSomething[argument][1] > ? - person Peter Boughton; 05.10.2011
comment
Кроме того, поскольку потенциально могут быть переданы дополнительные аргументы, что означает, что неизвестные столбцы попытаются проверить, вместо этого, вероятно, имеет больше смысла циклическое перебор list=#QueryName.ColumnList#. - person Peter Boughton; 05.10.2011