Я использую Coldfusion 9,0,0,251028 в 64-разрядной версии Windows 7 с базой данных Microsoft Access 97.
Код предназначен для приложения, которое берет отправленное сообщение из формы и публикует его на другой странице (Breaknews.cfm). Значения формы вставляются в таблицу «news» в базе данных, включая дату отправки сообщения (mes_dat) и дату его истечения (exp_dat).
В базе данных столбцы is_current и display имеют значение по умолчанию, равное 0.
Действие формы new_process.cfm, которое выполняет две функции:
1) Имеет ли <cfset expdate = createdate(end_year, end_month, end_day)>
. End_year, end_month и end_day - выпадающие селекторы, которые устанавливают дату истечения срока действия. Проблема, с которой я столкнулся, заключается в том, что expdate не может быть вставлен post_breaking.cfm, но только когда он помещен в сеть, на моем локальном тестовом сервере, похоже, нет проблем.
2) Включает шаблон с именем "post_breaking.cfm", который выполняет следующие запросы:
<cfquery name="get_init_info" datasource="#db#">
select id
from news
where is_current = 1
</cfquery>
<cfquery name="update_info_1" datasource="#db#">
update news
set is_current = 0, scrollshow = 0
</cfquery>
<cfif get_init_info.recordcount NEQ 0>
<cfquery name="update_info_2" datasource="#db#">
update news
set display = 1
where id = #get_init_info.id#
</cfquery>
</cfif>
<cfquery name="put_in_info" datasource="#db#">
insert into news
(is_current, display, mes_dat,mes_tim,mes_sub,mes_text,scrollshow, exp_dat)
values
(1,0, #createodbcdate(now())#, #createodbctime(now())#, '#subject#', '#message#',1, #expdate#)
</cfquery>
Это сообщение затем отображается на BreakingNews.cfm, если столбец is_current в таблице новостей равен 1. Это код, который я унаследовал, поэтому я не уверен, как он это делает, но код допускает только 5 сообщений в время для is_current = 1.
Часть, которую я пытаюсь осуществить, - это выполнение запроса при загрузке breaknews.cfm, который проверяет, находится ли exp_dat между now () и mes_dat, чтобы установить is_current в 1, при этом сохраняя только 5 элементов, имеющих is_current, равный 1 .
При обращении к Breaknews.cfm он выполняет следующие запросы:
<cfquery name="get_info" datasource="#db#">
select *
from news
where
<cfif not isdefined("id")>
is_current = 1
<cfelse>
id = #id#
</cfif>
order by mes_dat desc, mes_tim desc
</cfquery>
<cfquery name="add_exp" datasource="#db#">
UPDATE news
SET is_current = 1
WHERE now() BETWEEN mes_dat AND exp_dat
</cfquery>
<cfquery name="remove_exp" datasource="#db#">
UPDATE news
SET is_current = 0
WHERE now() NOT BETWEEN mes_dat AND exp_dat
</cfquery>
Это приведет к тому, что сообщения, имеющие exp_dat между now () и mes_dat, будут отображаться, а в противном случае не будут отображаться на breaknews.cfm.
Однако при отправке нового сообщения при первом доступе к Breaknews.cfm отображается только вновь отправленное сообщение.
Если страница обновлена, сообщения, которые были отфильтрованы правильно, будут отображаться под новым сообщением, но теперь на странице будет отображаться шесть элементов, а их должно быть только пять.
Как получить правильное количество сообщений, чтобы они отображались в первый раз без обновления?
Я получил совет заменить запрос get_init_info на
<cfquery name="get_init_info" datasource="#db#">
select id
from news
where exp_dat > now()
</cfquery>
но это привело к тому, что все остальные строки в is_current и scrollshow были изменены на 0 после создания нового сообщения (хотя scrollshow и is_current нового сообщения равны 1).