我是 ColdBox(和一般的 mvc)的新手,一直试图自己解决这个问题,但无济于事。查找功能在我们的程序站点上运行良好,我试图通过一点一点地将它切换到 mvc 来弄湿我的脚。
在我的 mvc 测试站点上,我有一个查询,当在我的本地机器上执行时,它会正确返回预期的元素。但是当它在实时站点上运行时,无论返回数组中有多少元素,它都会重复第一个元素。
本地机器:ColdBox 4.3、Lucee 4.5.5、MySQL 5.6.37、PHPMyAdmin 4.4.15
上线:ColdBox 4.3、ACF 2016、MySQL 5.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 日期选择器。如果有人认为它会有所帮助,我可以发布该代码。但是,无论是否使用日期选择器,或者即使它是否出现在页面上,只要从测试页面上的硬编码值中转出查询结果都会显示相同的问题。
请注意,这在我们的程序网站上一切正常,但我很难将事情切换到 mvc,如果有任何关于我哪里出错的提示或建议,我将不胜感激!提前谢谢大家!
更新:这里是来自本地站点的 prc.milestonesByDate 转储:
[{"date":"1986 年 12 月 26 日星期五","event":"俄罗斯 Mil Mi-34 首飞","milestoneID":435},{"date":"12 月 26 日星期二, 1995","event":"印度海军 HAL Dhruv(PT4 原型(prototype)机)首飞","milestoneID":428}]
和现场直播一样:
[{"date":"1986 年 12 月 26 日星期五","milestoneID":435,"event":"俄罗斯 Mil Mi-34 首飞"},{"date":"12 月 26 日星期五, 1986","milestoneID":435,"event":"俄罗斯 Mil Mi-34 首飞"}]
最佳答案
这里发生的问题是 for
ACF 和 Lucee 中查询的循环表现有点不同。
我不确定这是什么原因。但我观察到的是 for
Lucee 中的循环类似于 <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);
}
有关其工作原理的示例。
关于mysql - cfc 中的查询在本地返回 [n] 项,但在实时站点上重复第一个元素 [n] 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47983998/