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);
}

关于它如何工作的例子。

ACF

Lucee

以上是关于cfc中的查询返回本地的[n]项,但在实时站点上重复第一个元素[n]次的主要内容,如果未能解决你的问题,请参考以下文章

本地/实时站点上的相同查询,性能大不相同

用户登录 LocalHost 时出现意外的 HTTP 500 错误,但在实时站点上登录成功 [关闭]

WordPress 本地主机站点重定向到实时站点

在实时服务器上安装 Laravel 依赖项

上传文件(图像)在实时服务器上不起作用,但在dev上工作

将 wordpress 站点从实时设置到本地,URL 不起作用