запрос в 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);
}

Опять же, это отлично работает локально. Например, он покажет две разные вехи на 26 декабря — одну в 1986 году и одну в 1995 году. Но на живом сайте веха 1986 года будет показана дважды.

Однако запуск только SQL в PHPMyAdmin на реальном сайте работает так, как ожидалось:

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. Я могу опубликовать этот код, если кто-то считает, что это будет полезно. Но просто вывод результатов запроса из жестко закодированных значений на тестовой странице показывает одну и ту же проблему, независимо от того, используется ли средство выбора даты или даже присутствует ли оно на странице.

Обратите внимание, что все это отлично работает на нашем процедурном сайте, но мне трудно переключиться на mvc, и я был бы признателен за любые советы или предложения о том, где я ошибаюсь! Спасибо всем заранее!

ОБНОВЛЕНИЕ: вот дамп prc.milestonesByDate с местного сайта:

[{"date":"Пятница, 26 декабря 1986 г.","event":"Первый полет российского Ми-34","milestoneID":435},{"date":"Вторник, 26 декабря 1995 г." ,"event":"Первый полет корабля HAL Dhruv (Protoype PT4) ВМС Индии","milestoneID":428}]

И то же самое в прямом эфире:

[{"date":"Пятница, 26 декабря 1986 г.","milestoneID":435,"event":"Первый полет российского Ми-34"},{"date":"Пятница, 26 декабря 1986 г." ,"milestoneID":435,"event":"Первый полет российского Ми-34"}]


person daltec    schedule 26.12.2017    source источник


Ответы (1)


Проблема заключается в том, что цикл for для запроса в ACF и Lucee ведет себя немного по-разному.

Я не уверен в причине этого. Но я заметил, что цикл for в Lucee работает так же, как цикл <cfloop query="">. Но в АКФ такого нет. В 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

Люси

person rrk    schedule 27.12.2017
comment
Большое спасибо, РРК! Это действительно помогло - работает на Lucee и ACF, без проблем. Большое спасибо за Вашу помощь! Я даже не знал, с чего начать. Но благодаря вам я начал больше разбираться в различиях между ACF и Lucee. Для всех, кто читает это, raymondcamden.com/2015 /10/01/some-cool-things-in-lucee — хороший пост от Рэя Камдена для начала. Большое спасибо, еще раз, RRK! Я ценю помощь! - person daltec; 27.12.2017
comment
Почему бы вам все равно не использовать переменную row? Вы перебираете запрос и устанавливаете для каждой строки запроса индекс, а затем выводите записи для этого индекса. Чтобы быть чище, обратитесь к индексу. for(row in query) также может быть for(x in query) и тогда ссылаться на x вместо query. Я видел проблемы с циклами раньше, когда query.variable в ACF возвращает первый экземпляр variable в query для каждого цикла вместо каждой строки переменных из query. - person Shawn; 28.12.2017
comment
Привет, Шон, спасибо за совет! И чтобы ответить на ваш вопрос, я всегда раньше использовал старый добрый ‹cfloop query=queryMilestonesByDate›, который при использовании только в этой одной функции никогда не нуждался в области действия внутри самого цикла. А может мне просто повезло! :-) - person daltec; 28.12.2017