Coldfusion - Как мне избежать переменной внутри переменной? - PullRequest
2 голосов
/ 25 февраля 2011

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

<cfloop index="q_number" from="1" to "10">

<cfquery name="q#q_number#_check" datasource="datasource">
  SELECT *
  FROM table
</cfquery>

<cfif len(#q#q_number#check.something#) GT 0>

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

<cfset escape_var = q#q_number#_check.question>
<cfif len(#variables.escape_var#) GT 0>

но это не сработало.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 25 февраля 2011

д # q_number # check.something

Запрос помещен в область видимости переменных, что означает, что вы можете использовать обозначение массива для доступа к нему. Это работает в CF9. Хотя вам может потребоваться добавить [rowNumber] для CF8.

 <cfif len(variables["q#q_number#_check"].something) GT 0>

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

0 голосов
/ 25 февраля 2011

если вы не получаете ничего особенного в цикле, тогда зачем вообще нужен запрос?Не могли бы вы просто использовать один запрос.если вы используете предложение where, тогда используйте запрос запросов внутри вашего цикла, чтобы получить другую информацию.

<cfquery name="myquery" datasource="ds">
select * from mytable
</cfquery>

<cfset myquestions = arrayNew(1)>

<cfloop index="q_number" from="1" to "10">

 <cfquery name="myotherquery" dbtype="query">
  select * from myquery
  where question = #q_number#
 </cfquery>


 <cfif myotherquery.something GT 0>
  <cfset myquestions[q_number] = myotherquery.something>
 </cfif>

Если вам не нужны результаты запроса внутри вашего цикла где-то за пределами цикла, вам не нужно динамическое имя запроса.Каждый раз при прохождении цикла имя будет перезаписываться.

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

Надеюсь, это поможет Тиму

0 голосов
/ 25 февраля 2011

Вы можете использовать оценку, чтобы сохранить запрос в переменной, а затем использовать его, как обычно.

<cfset resolved_query = evaluate("q#q_number#_check")>
<cfif len(resolved_query.something) GT 0>
0 голосов
/ 25 февраля 2011

ЕСЛИ у вас внутри взгляд? в этом случае нет необходимости динамически именовать ваш запрос.

Если вам это нужно вне взгляда, я бы порекомендовал поместить набор результатов в массив.

<cfset checkArray = arrayNew()>
<cfloop index="q_number" from="1" to "10">

<cfquery name="q_check" datasource="datasource">
  SELECT *
  FROM table
</cfquery>

<cfif len(q_check.something) GT 0>

</cfif>
<cfset arrayAppend(checkArray,qcheck)>
 </cfloop>
 <cfif len(checkArray[1].something) GT 0>

 </cfif>

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

0 голосов
/ 25 февраля 2011
<cfif len(q#q_number#check.something) GT 0>

Это работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...