在本地的 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"}]
这里发生的问题是 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);
}
有关其工作原理的示例。
我是 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"}]
这里发生的问题是 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);
}
有关其工作原理的示例。