ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-06-22 12:11:26  阅读:215  来源: 互联网

标签: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:

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

来自现场的同样的事情:

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

解决方法:

这里发生的问题是ACF和Lucee中查询的for循环行为有点不同.

我不确定这个的原因.但我观察到的是,Lucee中的for循环就像< cfloop query =“”>一样.但在ACF中并非如此.
在ACF中,您需要在循环内使用变量行,而不是使用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中都可以工作,您可以将其更改为以下(我认为这是正确的方法,因为您正在使用(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

标签:mysql,coldfusion,coldbox
来源: https://codeday.me/bug/20190622/1263380.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有