2013-06-11 2 views
1

Редактировать: ВОПРОС - это дубликат, но ОТВЕТ не является!ColdFusion - Вложенная переменная (чтение динамической переменной)

У меня есть следующий код:

<cfquery name="contact" datasource="thesource"> 
    SELECT * FROM #table# WHERE foo = '#bar#' 
</cfquery> 

, а затем позже (это часть проблемы):

<cfloop from="0" to="9" index="i"> 
    <cfset thisvar = Evaluate("contact.check" & i) /> 
    <cfoutput> 
    #thisvar# 
    </cfoutput> 
</cfloop> 

При исполнении, он бросает хороший большой «Variable contact.check0 является Не определено». Однако, #contact.check0# будет выводить только штраф, если он жестко закодирован.

Любые идеи о том, как исправить это?

Примечание: Я видел Coldfusion - variable field name when looping through database query results, и, несмотря на то, что проблема, похоже, точно такая же, решения не работают. В соответствии с комментариями, я также получаю ошибку «невозможно преобразовать в число». Я замечаю, что Томалак упоминает «немного поймать», но никогда не говорит, что это такое. В статье, в которой он ссылается, я пробовал каждую синтаксически эквивалентную форму, и все это выдает ошибку ... либо не может преобразовать в число, либо не определен.

Кроме того, я знаю, что Evaluate() имеет накладные расходы и «не должен использоваться». Я возьму любое решение, которое работает, независимо от того, имеет ли он в нем оценку или нет.

Это на ColdFusion 9.

Спасибо

Edit: в то время как подобный вопрос уже был ответ, этот вопрос был другой причиной. См. Принятый ответ ниже.

+2

Правильный ответ в указанной вами ссылке должен работать. Каков был ваш код, который вызвал ошибку «невозможно преобразовать в число». –

+0

Согласен, код в этом ответе будет работать нормально, если ваш запрос содержит имена столбцов «check0, ... check9». * RE: Я замечаю, что Томалак упоминает «немного поймать», но никогда не говорит, что это такое * Да, он это сделал. Это редактирование, где он говорит: «При доступе к объектам Query с помощью« угловой скобки »-syntax вы должны добавить индекс номера строки (на основе 1), то есть' queryName ["columnName"] [rowNumber] '. – Leigh

+0

У вас есть столбец в запросе с именем «check0»? –

ответ

3

Это смешно и нелепо. Рабочий код (переехал вещи вокруг немного):

<cfoutput> 
    <cfloop from="0" to="9" index="i"> 
    <cfset thisvar = contact["check"&i][1] /> 
    #thisvar# 
    </cfloop> 
</cfoutput> 

не работает код:

<cfoutput query="contact"> <!--- this line here ---> 
    <cfloop from="0" to="9" index="i"> 
    <cfset thisvar = contact["check"&i][1] /> 
    #thisvar# 
    </cfloop> 
</cfoutput> 

Кто-то вложил cfoutput теги вокруг всей страницы. Хотя это обычно не будет проблемой, они ТАКЖЕ объявили атрибут запроса. Это как-то переписало исходный запрос из db. Вызов contact.check0 работал отлично, но, по-моему, создание динамического имени динамически пыталось ссылаться на атрибут запроса cfoutput.

Спасибо Peter Boughton за предложение извлечь код проблемы ..., который привел меня к этой реализации, и Саймон для публикации синтаксически правильного кода. Очки идут к ним.

+1

Это, безусловно, довольно странно. Возможно, «contact [" check "и i] [contact.CurrentRow]' работал бы в , но если вы хотите только 1 строку, вам не нужно все время цитировать запрос это так, как у вас есть работы, будет достаточно :) –

+1

* .. поместите теги cfoutput вокруг всей страницы .. они ТАКЖЕ объявили атрибут запроса. * Hm .. но вложенные два вывода запроса не разрешены, так что это похоже на то, все еще отсутствует. Если у вас все еще есть полноценное извлечение/воспроизведение, мне было бы интересно увидеть это, поскольку я никогда не сталкивался с этой проблемой. – Leigh

+0

На самом деле теперь вы упомянули об этом, у меня были проблемы в прошлом, когда '' вызвал ошибку компиляции. Я не могу вспомнить 100%, было ли это в CF9 или Railo. –

6

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

<!--- make sure that there is actually a result ---> 
<cfif contact.RecordCount EQ 0> 
    NO RESULT 
<cfelse> 
    <cfloop from="0" to="9" index="i"> 
     <!--- assumes that you want row 1 ---> 
     <!--- check.CurrentRow could also be used instead of 1 ---> 
     <cfset thisvar = contact['check'&i][1] /> 
     <cfoutput> 
     #thisvar# 
     </cfoutput> 
    </cfloop> 
</cfif> 

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

редактировать, как Дэн Bracuk отметил, что это точная копия вопроса вы связаны в вашем вопросе, Coldfusion - variable field name when looping through database query results

+0

* ... попытка оценить столбец без указания номера строки * Да, но в CF9 'contact.check0' должен быть сокращен до значения в первой строке запроса. Поэтому он не должен вызывать неопределенную ошибку - если, возможно, переменная 'contact' не будет перезаписана каким-либо другим значением * после того, как * запрос будет запущен? FWIW, он работал отлично для меня w/CF9 в любом случае. – Leigh

+0

Эта логика не изменилась в последних версиях CF. Я ожидал бы contact.check0 [1] или contact.check0.1, чтобы, возможно, правильно оценить. Я согласен, что это немного несовместимо, хотя, но опять же есть другие, лучшие способы достижения вашей цели, как указано здесь и там. –

+0

@ Simonatmso.net: Я копирую и вставляю код. Я получаю «Значение check0 не может быть преобразовано в число». Кроме того, для записи я не писал запрос db вверху, поэтому я не хотел его трогать. @Leigh: я еще раз проверю, чтобы «контакт» не был перезаписан, но поскольку существующий код уже работал (мы просто пытаемся сделать его более расширяемым для будущего), я не думаю, что это изменилось. Тем не менее, я снова посмотрю. –

Смежные вопросы