如何在表中插入过期日期并使消息过期而不破坏功能?

时间:2011-03-23 21:51:10

标签: coldfusion

我在Windows 7 64位上使用Coldfusion 9,0,0,251028,带有Microsoft Access 97数据库。

该代码适用于从表单接收提交的消息并将其发布到其他页面的应用程序(breakingnews.cfm)。表单值被插入到数据库的“新闻”表中,包括消息提交的日期(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>

如果新闻表上的列is_current是1,则该消息将显示在breakingnews.cfm上。这是我继承的代码,所以我不确定它是如何做的,但代码只允许5条消息时间到了is_current = 1.

我试图实现的部分是在breaknews.cfm加载时运行查询,检查exp_dat是否在now()和mes_dat之间,将is_current设置为1,同时仍然只保留5个is_current为1的项目

当访问breakingnews.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>

这将导致在now()和mes_dat之间显示exp_dat的消息,否则不会在breakingnews.cfm上显示。

但是,当提交新邮件时,第一次访问breakingnews.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)。

1 个答案:

答案 0 :(得分:0)

我的第一个想法是改变系统如何显示新闻,但由于你不能控制它,这是我的建议。请记住,我从未使用过Access,所以我使用的是MS-SQ语法。

获取您想要的5个项目的ID

select top 5 id 
from bews 
where exp_date > #createodbcdate(now)#
    and display = 1

现在,在所有项目上设置display = 0。

最后,重新显示您之前找到的ID。

update news
set display = 1 
where id in #valuelist(query, "id")

如果您有任何问题或更正,请随时发表评论。