2014-09-08 14 views
9

Sono molto curioso del motivo per cui ciò sta accadendo. Ci ho provato due volte e, dopo un sacco di ricerche su google, non ho trovato alcuna ragione per cui capisco. L'essenza di esso:Cloop nidificato con meno record del ciclo esterno causa errore "indice di matrice fuori intervallo"

Query 1: selectContent (6 articoli; niente spazi/nulli ecc)

Domanda 2: selectPricing (5 articoli; niente spazi/nulli ecc)

uscita:

<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> 

Questo darà il seguente errore: Indice della matrice fuori intervallo: 5

l'errore si verifica solo quando la seconda q uery ha meno record del primo. In sostanza, sembra che il primo cfloop riprenda l'iterazione del ciclo da quel secondo e questo causi il problema, ma anche solo se si dispone di quel terzo cfloop raggruppato. L'intero cfloop interno corre, come è nella fonte.

mi è venuta in mente due modi per risolvere questo:

  • fare questo con cfoutput/gruppo, ma questo è relativamente brutta in quanto significa che un sacco di chiusura della cfoutputs da altre parti della pagina.
  • attaccare un cfbreak su quel terzo cfloop se currentRow corrisponde al recordcount.

Così, due domande:

  • Perché questo ancora accadendo?

  • Dovrei utilizzare un approccio completamente diverso qui (il fatto che googling/so'ing non stia trovando altri con questo problema sembra senz'altro implicare che ...)?

EDIT ho depositato questo come un bug Coldfusion in base al feedback di Adam Cameron sotto. Bug #3820049

+0

Hai nessun attributo sul tag interno di cfloop, è quella sintassi valida? – Busches

+2

Sì. Questo scorre attraverso i risultati raggruppati, cioè se la tua query è stata raggruppata per genere, ciò restituirebbe tutti i nomi per genere (vedi http://www.bennadel.com/blog/2359-coldfusion-10-using-the-group-attribute -con-cfloop-to-gruppo-query-rows.htm). Funziona se non ce l'hai all'interno di quel primo cfloop (prima di quello raggruppato).Dovrebbe fondamentalmente funzionare come il gruppo cfoutput, che è quello che Adam usa sotto come soluzione alternativa, e si può vedere essenzialmente la stessa sintassi usata lì. – sckd

+0

* Dovrei utilizzare un approccio completamente diverso qui * Sono curioso di sapere perché più query e cicli annidati rispetto a una singola query con un JOIN? – Leigh

risposta

5

Ben fatto, hai trovato un bug in CF. Posso replicare (PS ... it'd've stato bello se aveste compreso alcuni dati di esempio salvare me doverlo fare!)

Il work-around è dritto in avanti però:

<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> 

Nota come ho usato <cfoutput> per fare il ciclo interno.

Si tratta di un grave bug in ColdFusion (10 e 11), e si dovrebbe sollevare sul loro bug base (se lo fate, segnalare il biglietto numero/URL di nuovo qui in modo che possiamo votare su di esso)

+0

Mi dispiace per i dati mancanti. E ragazzo, non posso credere di aver trovato un insetto. Inizialmente avevo risolto anche con cfoutput (vedi OP), ma preferivo la seconda opzione su questa pagina specifica in quanto vi è sia il codice sopra che quello sottostante che altrimenti richiedeva molte aperture/chiusure di cfoutput per evitare errori di configurazione di annidamento. Questa è una delle ragioni per cui sto scavando il gruppo di cfloop in generale. Inserirò questo come bug e collegherò qui e aggiornerò anche il post originale. – sckd

+0

Nessun problema con i dati. La tua domanda è stata molto meglio di quella che molti hanno chiesto di recente. Solo un suggerimento per la prossima volta, tutto qui: più indipendente e indipendente è il tuo caso di repro, più facile è per noi copiarlo/incollarlo ed eseguirlo da soli. –

Problemi correlati