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

时间:2017-12-26 21:43:43

标签: mysql coldfusion coldbox

我是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:

[{“date”:“1986年12月26日星期五”,“事件”:“俄罗斯米尔米-34的第一次飞行”,“里程碑ID”:435},{“日期”:“12月26日星期二,1995年,“事件”:“印度海军的第一次飞行HAL Dhruv(Protoype PT4)”,“milestoneID”:428}]

来自现场的同样的事情:

[{“date”:“1986年12月26日星期五”,“milestoneID”:435,“事件”:“俄罗斯米尔-34第一次飞行”},{“日期”:“12月26日星期五,1986“,”milestoneID“:435,”事件“:”俄罗斯米尔米-34的第一次飞行“}}

1 个答案:

答案 0 :(得分:4)

此处发生的问题是 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);
}

有关其工作原理的示例。

<强> ACF

<强> Lucee