использовать переменную в имени поля в cfloop

У меня есть несколько полей в базе данных с именами p1, p2, p3 и так далее, они возвращаются запросом GetUser. Я хочу проверить их значения, но у меня возникают следующие ошибки кода. Я уверен, что мое форматирование «GetUser.p#x#» неверно, но я не могу понять, как это сделать. Любая помощь приветствуется.

У меня есть следующий код, который работает...

    <cfquery name="GetUser"> 
        SELECT id, p00, p01, p02, p03, p04, p05, p06
        FROM users 
        where id = #session.user_id#
    </cfquery>

    <cfoutput query="GetUser">
        <cfif p01 is 1><li>Post 01</li></cfif>
        <cfif p02 is 1><li>Post 02</li></cfif>
        <cfif p03 is 1><li>Post 03</li></cfif>
        <cfif p04 is 1><li>Post 04</li></cfif>
        <cfif p05 is 1><li>Post 05</li></cfif>
        <cfif p06 is 1><li>Post 06</li></cfif>
    </cfoutput>

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

    <cfloop index = "x" from = "1" to = "6"> 
        <cfif GetUser.p0#x# is 1><li>Post #x#</li></cfif>
    </cfloop>

Но это ошибки. Поэтому я пытаюсь понять, как этого добиться.

// Есть аналогичный вопрос, который предполагает, что требуется queryName["columnName"][rowNumber]. Это другое и более простое.


person mck    schedule 24.07.2016    source источник
comment
getUser['p0' +x] — это синтаксис динамической переменной в вашем запросе.   -  person Matt Busche    schedule 24.07.2016
comment
Это должно сказать из вашего запроса   -  person Matt Busche    schedule 24.07.2016
comment
Близко, но не совсем. ‹cfloop index = x from = 0 to = 9› ‹cfif getUser['p0' + x] is 1›‹li›Post 0#x#‹/li›‹/cfif› ‹/cfloop› приводит к ошибке: can' t привести строку [p0] к числовому значению.   -  person mck    schedule 24.07.2016
comment
извините, слишком много Java в последнее время. Должно быть & вместо +   -  person Matt Busche    schedule 24.07.2016


Ответы (2)


Хорошо, понял... ответ был:

 <cfloop index = "x" from = "1" to = "10">
   <cfif getUser['p0' & x] is 1><li> 0#x#</li> </cfif>
 </cfloop>

У Мэтта Буше почти получилось. getUser['p0' +x] должен быть getUser['p0' & x]

Спасибо!

person mck    schedule 24.07.2016
comment
Это полный рабочий код? Обычно для ссылок на столбцы динамических запросов также требуется номер строки, т. е. queryName["columnName"][rowNumber]. См. пример: trycf.com/gist/b304d69d93f16b4822a3455118fbc266/ - person Leigh; 24.07.2016
comment
Да, это полный рабочий код, и он отличается от того, что помечен как дубликат. - person mck; 25.07.2016
comment
Оба потока спрашивают, как получить динамический доступ к столбцам запроса. Ответ тот же: используйте нотацию ассоциативного массива. Конечно, Lucee/Railo может позволить вам опустить номер строки запроса. АКФ нет. Фрагмент выше не компилируется. Отсутствует закрывающий тег CFIF. - person Leigh; 25.07.2016
comment
Это может быть правильно. Я использую Lucee 5. Но для чего это стоит, другая нить была мне неясна. Я просмотрел его, прежде чем опубликовать этот вопрос. Кстати: исправлено ‹/CFIF› - person mck; 25.07.2016
comment
Спасибо за обновление ответа. Кстати, если значения столбца всегда равны 1 или 0, вы также можете использовать ярлык <cfif getUser['p0' & x]>. CF будет неявно преобразовывать числовые значения в логические. Значение 0 равно false. Любое другое число (1, -1, и так далее) равно true. Также не забудьте использовать cfqueryparam для всех переменных параметров запроса. Это повышает производительность и помогает защитить запросы от SQL-инъекций. - person Leigh; 25.07.2016
comment
Потрясающий! Спасибо :-) - person mck; 26.07.2016

Отредактировано для ясности:

<cfquery name="getuser"  datasource="STACK">
    Select * from stackoverflow
</cfquery>

<cfset fieldNumber = #ListLen(getuser.ColumnList)#>
<cfoutput>
<cfloop index="i" from="1" to="#fieldNumber#"> 
This is P#i#
</cfloop>
</cfoutput>

Судя по вашему комментарию, вам нужны условные проверки на основе возвращаемого вами столбца. Предполагая, что ваши столбцы имеют одинаковые имена, возвращаемый столбец всегда должен соответствовать итерации цикла. Вам нужно только перебрать столько полей, сколько у вас есть, и таким образом он всегда будет делать именно это, без необходимости жестко кодировать 10 или что-то еще.

Поэтому вместо того, чтобы проверять, является ли значение p1 или p2, вы можете просто использовать #i#, например:

<cfif i is 1> P1 is here. </cfif>

person TRose    schedule 24.07.2016
comment
Я думаю, мне нужно быть более ясным. У меня есть следующие имена полей в моей таблице: p0, p1, p2, p3 и т. д. Я делаю этот цикл, чтобы проверить значения в этих полях в запросе. поэтому p#x# должен проверить getuser.p1, затем getuser.p2 и так далее. р не является переменной. Это константа в именах полей. - person mck; 24.07.2016
comment
Обновленный ответ. Я пересек некоторые ментальные провода и предположил, что вы по какой-то причине зацикливаетесь на полях формы. - person TRose; 24.07.2016
comment
Привет, я думаю, что все еще неясно, что я пытаюсь сделать. Я обновил вопрос, чтобы быть предельно конкретным в отношении того, чего я пытаюсь достичь. Извините за отсутствие ясности. - person mck; 24.07.2016