cfc中的查询返回本地的[n]项,但在实时站点上重复第一个元素[n]次
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cfc中的查询返回本地的[n]项,但在实时站点上重复第一个元素[n]次相关的知识,希望对你有一定的参考价值。
我是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 datepicker。如果有人认为它会有所帮助,我可以发布该代码。但是,只要在测试页面上从硬编码值中转出查询结果,就会显示相同的问题,无论是使用了datepicker还是在页面上都存在。
请注意,这一切都在我们的程序网站上运行正常,但我很难将事情转换为mvc,并希望得到任何有关我出错的提示或建议!谢谢大家!
更新:这是从本地站点转储prc.milestonesByDate:
[{“日期”:“1986年12月26日星期五”,“事件”:“俄罗斯米尔米-34的第一次飞行”,“milestoneID”:435},{“日期”:“1995年12月26日星期二” ,“事件”:“印度海军的第一次飞行HAL Dhruv(Protoype PT4)”,“milestoneID”:428}]
来自现场的同样的事情:
[{“date”:“1986年12月26日星期五”,“里程碑ID”:435,“事件”:“俄罗斯米尔米-34的第一次飞行”},{“日期”:“1986年12月26日星期五” ,“milestoneID”:435,“事件”:“俄罗斯米尔Mi-34的第一次飞行”}]
这里发生的问题是ACF和Lucee中查询的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);
}
关于它如何工作的例子。
以上是关于cfc中的查询返回本地的[n]项,但在实时站点上重复第一个元素[n]次的主要内容,如果未能解决你的问题,请参考以下文章