9

我很好奇为什么会这样。我现在已经遇到了两次,经过大量的谷歌搜索/so'ing,我还没有找到任何我真正理解的理由。它的要点:

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

仅当第二个查询的记录少于第一个时,才会出现该错误。本质上,感觉就像第一个 cfloop 接管了第二个的循环迭代,这会导致问题,但前提是您在那里有第三个分组的 cfloop。整个内部 cfloop 运行,就像在源代码中一样。

我想出了两种方法来解决这个问题:

  • 使用 cfoutput/group 执行此操作,但这相对难看,因为这意味着要关闭页面其他部分的大量 cfoutput。
  • 如果 currentRow 与记录计数匹配,则在第三个 cfloop 上粘贴一个 cfbreak。

所以,两个问题:

  • 为什么会发生这种情况?

  • 我是否应该在这里使用完全不同的方法(谷歌搜索/搜索并没有找到其他有此问题的人的事实似乎暗示着......)?

编辑 我已根据 Adam Cameron 在下面的反馈将其归档为 Coldfusion 错误。错误 #3820049

4

1 回答 1

5

干得好,您在 CF 中发现了一个错误。我可以复制它(PS……如果你提供了一些样本数据,我就不必这样做了!)

解决方法很简单:

<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)中的一个严重错误,您应该在他们的错误基础上提出它(如果您这样做,请在此处报告票号/URL,以便我们对其进行投票)

于 2014-09-08T10:22:21.573 回答