2014-09-08 1 views
9

Мне очень любопытно, почему это происходит. Я столкнулся с этим два раза сейчас, и после тонны поискового запроса/так, я не нашел причин, по которым я действительно понимаю. Суть ее:Вложенные cfloops с меньшим количеством записей, чем внешний контур, вызывают ошибку «индекс массива вне диапазона»

Запрос 1: selectContent (6 записей; нет заготовки/нули и т.д.)

Запрос 2: selectPricing (5 записей; нет заготовки/нули и т.д.)

Выход:

<cfloop query="selectContent"> 
    <section> 
     #selectContent.h2# 
     <cfif selectContent.id eq 3> 
      <cfloop query="selectPricing" group="groupCol"> 
       <table class="pricing"> 
       <thead> 
        <tr> 
         <th>#description#</th> 
         <th>Price</th> 
        </tr> 
       </thead> 
       <tbody> 
        <cfloop> 
        <tr> 
         <td>#selectPricing.description#</td> 
         <td>#selectPricing.price#</td> 
        </tr> 
        </cfloop> 
       </tbody> 
       </table> 
      </cfloop> 
     </cfif> 
     #selectContent.content# 
    </section> 
</cfloop> 

Это даст следующее сообщение об ошибке: индекс массива вне диапазона: 5

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

Я придумал два способа решения этой проблемы:

  • сделать это с cfoutput/группой, но это относительно уродливо, как это означает, что много закрытия cfoutputs из других частей страницы.
  • вставьте cfbreak на этом третьем cfloop, если currentRow соответствует номеру записи.

Итак, два вопроса:

  • Почему это даже происходит?

  • Должен ли я использовать совершенно другой подход здесь (факт, что поиск в googling/so'ing не находит других с этой проблемой, несомненно, подразумевает, что ...)?

EDIT Я подал это как ColdFusion ошибка на основе обратной связи Адам Камерона ниже. Bug #3820049

+0

У вас есть нет атрибутов на внутреннем теге cfloop, является ли это синтаксисом? – Busches

+2

Да. Это циклически проходит через сгруппированные результаты, т. Е. Если ваш запрос был сгруппирован по полу, который будет возвращать все имена по полу (см. Http://www.bennadel.com/blog/2359-coldfusion-10-using-the-group-attribute -с-cfloop к групповому запроса-rows.htm). Это работает, если у вас его нет в этом первом cfloop (перед сгруппированным).Он должен в основном работать так же, как и cfoutput group, что и использует Адам ниже в качестве обходного пути, и вы можете видеть по существу тот же синтаксис, который там используется. – sckd

+0

* Должен ли я использовать совершенно другой подход здесь? Мне любопытно, почему несколько запросов и вложенных циклов в отличие от одного запроса с JOIN? – Leigh

ответ

5

Молодцы, вы нашли ошибку в CF. Я могу повторить его (PS ... it'd've было здорово, если бы вы включили некоторые выборочные данные спаси меня, чтобы сделать это!)

Работа вокруг прямо вперед, хотя:

<cfscript> 
selectContent = queryNew("h2,id,content", "varchar,integer,varchar", [ 
    ["one", 1, "content.1"], 
    ["two", 2, "content.2"], 
    ["three", 3, "content.3"], 
    ["four", 4, "content.4"], 
    ["five", 5, "content.5"], 
    ["six", 6, "content.6"], 
    ["seven", 7, "content.7"] 
]); 

selectPricing = queryNew("groupCol,description,price", "varchar,varchar,varchar", [ 
    ["groupCol.1", "description.1", "1.11"], 
    ["groupCol.2", "description.2", "2.22"], 
    ["groupCol.2", "description.3", "3.33"], 
    ["groupCol.3", "description.4", "4.44"], 
    ["groupCol.3", "description.5", "5.55"], 
    ["groupCol.3", "description.6", "6.66"] 
]); 

</cfscript> 
<cfloop query="selectContent"> 
    <section> 
     <cfoutput>#selectContent.h2#</cfoutput> 
     <cfif selectContent.id eq 3> 
      <cfoutput query="selectPricing" group="groupCol"> 
       <table class="pricing"> 
       <thead> 
        <tr> 
         <th>#description#</th> 
         <th>Price</th> 
        </tr> 
       </thead> 
       <tbody> 
        <cfoutput> 
        <tr> 
         <td>#description#</td> 
         <td>#price#</td> 
        </tr> 
        </cfoutput> 
       </tbody> 
       </table> 
      </cfoutput> 
     </cfif> 
     <cfoutput>#selectContent.content#</cfoutput> 
    </section> 
</cfloop> 

Обратите внимание, как я использовал <cfoutput> для выполнения внутреннего цикла.

Это серьезная ошибка в ColdFusion (10 и 11), и вы должны поднять его на их bug base (если вы делаете, сообщить номер билета/URL назад здесь, чтобы мы могли голосовать на нем)

+0

Извините за недостающие данные. И мальчик, не могу поверить, что нашел ошибку. Первоначально я исправил его с помощью cfoutput (см. OP), но предпочел второй вариант на этой конкретной странице, так как есть код выше и ниже этого, который в противном случае потребовал много открытия/закрытия cfoutput, чтобы избежать ошибок конфигурации вложенности. Это одна из причин, по которой я копаю группу cfloop в целом. Я напишу это как ошибку и ссылку сюда и обновить исходный пост. – sckd

+0

Не беспокойтесь. Ваш вопрос был лучше, чем большинство из них, заданных здесь недавно. Просто предложение для следующего раза, вот и все: чем более автономным и свободно стоящим является ваш образ воспроизведения, тем легче нам копировать/вставлять и запускать его самостоятельно. –