2014-09-08 9 views
9

Ich bin sehr neugierig, warum das passiert. Ich bin jetzt zweimal reingelaufen, und nach einer ganzen Menge Googeln habe ich keinen Grund gefunden, den ich wirklich verstehe. Der Kern von ihm:Verschachtelte cfloops mit weniger Datensätzen als äußere Schleife verursachen "array index out of range" Fehler

Abfrage 1: selectContent (6 Datensätze; keine Leerzeichen/nulls etc)

Abfrage 2: selectPricing (5 Datensätze; keine Leerzeichen/nulls etc)

Output:

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

Dies wird den folgenden Fehler geben: Array-Index außerhalb des Bereichs: 5

der Fehler tritt nur auf, wenn der zweite q Sie hat weniger Einträge als die erste. Im Wesentlichen fühlt es sich so an, als würde der erste cfloop die Schleifeniteration von der zweiten übernehmen und dies verursacht das Problem, aber auch nur, wenn Sie diesen dritten gruppierten cfloop drin haben. Der gesamte innere cfloop läuft, wie auch in der Quelle.

Ich habe mit zwei Möglichkeiten, um dieses Problem zu beheben:

  • tun dies mit cfoutput/Gruppe, aber das ist relativ hässlich wie es viele Schließung von cfoutputs aus anderen Teilen der Seite bedeutet.
  • Legen Sie einen cfbreak für diesen dritten cfloop fest, wenn currentRow mit dem Datensatz übereinstimmt.

also zwei Fragen:

  • Warum ist dies auch geschieht?

  • Sollte ich hier einen völlig anderen Ansatz verwenden (die Tatsache, dass Googeln/So'ing andere nicht mit diesem Problem findet, scheint das zu implizieren ...)?

EDIT Ich habe dies als Coldfusion Fehler auf Adam Camerons Feedback unter dieser Eintragung erhoben. Bug #3820049

+0

Sie haben keine Attribute auf dem inneren cfloop-Tag, ist das gültige Syntax? – Busches

+2

Ja. Dadurch werden die gruppierten Ergebnisse durchlaufen, dh wenn Ihre Abfrage nach Geschlecht gruppiert wurde, werden alle Namen nach Geschlecht zurückgegeben (siehe http://www.bennadel.com/blog/2359-coldfusion-10-using-the-group-attribute) -with-cfloop-to-group-query-rows.htm). Dies funktioniert, wenn Sie es nicht innerhalb des ersten cfloop (vor dem gruppierten) haben.Es sollte im Grunde dasselbe wie cfoutput group funktionieren, was Adam unten als Workaround verwendet, und Sie können im Wesentlichen die gleiche Syntax sehen, die dort verwendet wird. – sckd

+0

* Sollte ich hier einen völlig anderen Ansatz verwenden * Ich bin neugierig, warum mehrere Abfragen und verschachtelte Schleifen im Gegensatz zu einer einzigen Abfrage mit einem JOIN? – Leigh

Antwort

5

Gut gemacht, Sie haben einen Fehler in CF gefunden. Ich kann es replizieren (PS ... it'd've kühl gewesen waren Sie einige Beispieldaten enthalten retten ich, es zu tun haben!)

Die Behelfslösung gerade nach vorn aber:

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

Beachten Sie, wie ich <cfoutput> verwendet habe, um die innere Schleife zu machen.

Dies ist ein gravierender Fehler in Coldfusion (10 und 11), und Sie sollten es auf ihre bug base erhöhen (wenn Sie das tun, berichten die Ticketnummer/URL hier zurück, damit wir darüber abstimmen)

+0

Entschuldigung wegen der fehlenden Daten. Und Junge, kann nicht glauben, dass ich einen Fehler gefunden habe. Ich hatte es ursprünglich auch mit cfoutput behoben (siehe OP), bevorzugte aber die zweite Option auf dieser speziellen Seite, da sowohl ober- als auch unterhalb Code vorhanden ist, der sonst viel cFoutput öffnen/schließen musste, um Konfigurationsfehler zu vermeiden. Das ist einer der Gründe, warum ich die cfloop-Gruppe generell grub. Ich werde dies als Bug absetzen und hier verlinken und auch den ursprünglichen Beitrag aktualisieren. – sckd

+0

Keine Sorgen re Daten. Deine Frage war eine verdammt viel bessere Formulierung als die meisten, die hier kürzlich gefragt wurden. Nur ein Vorschlag für das nächste Mal, das ist alles: Je eigenständiger & freistehender Ihr Repro-Fall ist, desto einfacher ist es für uns, ihn selbst zu kopieren/einfügen und auszuführen. –