在本地的 cfc returns [n] 项中查询,但在实时站点上重复第一个元素 [n] 次

query in cfc returns [n] items on local, but repeats first element [n] times on live site

我是 ColdBox(和一般的 mvc)的新手,一直在尝试自己解决这个问题,但无济于事。查找功能在我们的程序站点上运行良好,我试图通过一点一点地将它切换到 mvc 来弄湿我的脚。

在我的 mvc 测试站点上,我有一个查询,当在我的本地计算机上执行时,它正确地 returns 了预期的元素。但是当它在实时站点上为 运行 时,它会重复第一个元素,无论返回数组中有多少元素。

本地机器:ColdBox 4.3、Lucee 4.5.5、MySQL5.6.37、PHPMyAdmin 4.4.15

现场:ColdBox 4.3,ACF 2016,MySQL5.7,PHPMyAdmin 4.6.6

这是我的 CFC 中的函数:

function getMilestonesByDate(required string pickedMonth='', required string pickedDay='') {

    transaction {
        queryMilestonesByDate = queryExecute("
            SELECT  tbl_milestones.ID as milestoneID, tbl_milestones.event, tbl_milestones.date
            FROM tbl_milestones
            WHERE MONTH(tbl_milestones.date) = :pickedMonth AND DAY(tbl_milestones.date) = :pickedDay AND YEAR(tbl_milestones.date) != 1111
            ORDER BY tbl_milestones.date ASC
        ", {
            pickedMonth: {value: arguments.pickedMonth, cfsqltype: "cf_sql_varchar"},
            pickedDay: {value: arguments.pickedDay, cfsqltype: "cf_sql_varchar"}
            }   
        );
    }

    milestonesByDate = arrayNew(1);

    for (row in queryMilestonesByDate) {
        returnStruct = StructNew();
        returnStruct["milestoneID"] = queryMilestonesByDate.milestoneID;
        returnStruct["event"] = queryMilestonesByDate.event;
        returnStruct["date"] = dateFormat(queryMilestonesByDate.date, "full");
        arrayAppend(milestonesByDate, returnStruct);
    }

    return serializeJSON(milestonesByDate);
}

同样,这在本地运行良好。例如,它将在 12 月 26 日显示两个不同的里程碑——一个在 1986 年,一个在 1995 年。但是在实时站点上,它将显示 1986 年的里程碑两次。

但是,运行仅在实时站点上的 PHPMyAdmin 中设置 SQL 即可正常工作:

SELECT tbl_milestones.ID as milestoneID, tbl_milestones.event, tbl_milestones.date 
FROM tbl_milestones 
WHERE MONTH(tbl_milestones.date) = '12' AND DAY(tbl_milestones.date) = '26' AND YEAR(tbl_milestones.date) != 1111 
ORDER BY tbl_milestones.date ASC 

所以查询似乎没问题。但是某处正在处理某些东西,我无法弄清楚。如果有帮助,这里是我的事件处理程序中对函数的调用:

function showMilestonesByDate( event, rc, prc ) {
    prc.milestonesByDate = milestoneModel.getMilestonesByDate(pickedMonth,pickedDay);
    event.renderData( type="json", data=prc.milestonesByDate );
}

所选月份和所选日期的值来自 jQuery UI 日期选择器。如果有人认为它有帮助,我可以 post 该代码。但是,无论 datepicker 是否被使用,甚至它是否存在于页面上,只是从测试页面上的硬编码值中转出查询结果都会显示相同的问题。

请注意,这在我们的程序网站上一切正常,但我很难将事情切换到 mvc,如果有任何关于我哪里出错的提示或建议,我将不胜感激!提前谢谢大家!

更新:这里是本地站点 prc.milestonesByDate 的转储:

[{"date":"Friday, December 26, 1986","event":"First flight of Russian Mil Mi-34","milestoneID":435},{"date":"Tuesday, December 26, 1995","event":"First flight of Indian Navy's HAL Dhruv (Protoype PT4)","milestoneID":428}]

直播中也一样:

[{"date":"Friday, December 26, 1986","milestoneID":435,"event":"First flight of Russian Mil Mi-34"},{"date":"Friday, December 26, 1986","milestoneID":435,"event":"First flight of Russian Mil Mi-34"}]

这里发生的问题是 ACFLucee 中查询的 for 循环的行为有点不同。

我不确定这是什么原因。但我观察到 Lucee 中的 for 循环与 <cfloop query=""> 一样工作。但在 ACF 中并非如此。 在 ACF 中,您需要在循环内使用变量 row 而不是使用 queryMilestonesByDate.

for (row in queryMilestonesByDate) {
    returnStruct = StructNew();
    returnStruct["milestoneID"] = queryMilestonesByDate.milestoneID;
    returnStruct["event"] = queryMilestonesByDate.event;
    returnStruct["date"] = dateFormat(queryMilestonesByDate.date, "full");
    arrayAppend(milestonesByDate, returnStruct);
}

因此,为了使循环在 ACF 和 Lucee 中都能正常工作,您可以按以下方式更改它(我认为这是正确的方法,因为您使用的是 for (row in queryMilestonesByDate))。

for (row in queryMilestonesByDate) {
    returnStruct = StructNew();
    returnStruct["milestoneID"] = row.milestoneID;
    returnStruct["event"] = row.event;
    returnStruct["date"] = dateFormat(row.date, "full");
    arrayAppend(milestonesByDate, returnStruct);
}

有关其工作原理的示例。

ACF

Lucee