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

标签 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 日期选择器。如果有人认为它会有所帮助,我可以发布该代码。但是,无论是否使用日期选择器,或者即使它是否出现在页面上,只要从测试页面上的硬编码值中转出查询结果都会显示相同的问题。

请注意,这在我们的程序网站上一切正常,但我很难将事情切换到 mvc,如果有任何关于我哪里出错的提示或建议,我将不胜感激!提前谢谢大家!

更新:这里是来自本地站点的 prc.milestonesByDate 转储:

[{"date":"1986 年 12 月 26 日星期五","event":"俄罗斯 Mil Mi-34 首飞","milestoneID":435},{"date":"12 月 26 日星期二, 1995","event":"印度海军 HAL Dhruv(PT4 原型(prototype)机)首飞","milestoneID":428}]

和现场直播一样:

[{"date":"1986 年 12 月 26 日星期五","milestoneID":435,"event":"俄罗斯 Mil Mi-34 首飞"},{"date":"12 月 26 日星期五, 1986","milestoneID":435,"event":"俄罗斯 Mil Mi-34 首飞"}]

最佳答案

这里发生的问题是 for ACFLucee 中查询的循环表现有点不同。

我不确定这是什么原因。但我观察到的是 for Lucee 中的循环类似于 <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

关于mysql - cfc 中的查询在本地返回 [n] 项,但在实时站点上重复第一个元素 [n] 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47983998/

相关文章:

mysql - Node mysql是否允许通过一个查询更新多行

Coldfusion 8 同时执行 CFIf 和 CFElse 语句

coldfusion - LIMIT 和 OFFSET 上的参数不起作用

angularjs - 白标应用程序的站点架构

MySql 检索所有用户的最后已知位置列表

mysql - 我需要为每个 root 帐户条目设置密码吗? - MySQL

php - 从数据库中获取数据以在下拉列表中设置为默认值 HTML/CSS/MYSQL/PHP

coldfusion - 如果查看某个页面则排除内容

sql - 如何防止coldfusion sql-injection on order by子句

javascript - Coldfusion 使用 ajax 使用下拉选择填充表单