如果数据库行项在特定时间内未更改,则自动更改

时间:2017-08-16 13:20:48

标签: php

我很难在PHP中为预订创建时间限额。我对此进行过研究,但不幸的是我不知道具体的条款是什么。

我已经有一个正常工作的预订模块,我需要添加一项功能,如果客户未确认,我会在30分钟内自动取消预订。

是否存在PHP代码片段,如果在30分钟内没有更改,它会自动设置行的值?

PS:抱歉英语不好。

2 个答案:

答案 0 :(得分:1)

  

是否存在PHP代码片段,如果在30分钟内没有更改,它会自动设置行的值?

没有。这是以数据为中心的,可能是您的预订"存储在数据库(例如MySQL)中?

PHP作为一个平台,99.9%的场景响应请求(CLI或HTTP) - 或者所谓的"事件驱动"。没有简单的方法来创建一个"事件"对于未来即将到期的东西而不是将你的思想超越纯PHP。

您更新&#34时可以event driven更新"使用您的DBMS'时间戳(例如,见ON UPDATE CURRENT_TIMESTAMP()),您可以从中检查(在任何未来事件中)该记录是否已过期" (上次更新的时间戳+30分钟)。

如果您需要在到期时生成事件(例如,发送电子邮件说明预订已取消),除非您有某种延期执行&#39; (某些排队平台的一个功能 - 超出了本答案的范围),您需要periodically poll(&#34;&#34;与事件驱动相反)查找已过期的任何记录。< / p>

在LAMP堆栈上通过PHP执行此操作的最常见方法是编写cronjob。这是一个永久运行的服务(最多每60秒一次)会触发您的代码。

如果您正在沿着轮询路线前进但只需要操纵日期(没有发送电子邮件等),您可以使用您的DBMS调度程序(例如MySQL events)进行调查。但是要注意一点 - 在数据库中隐藏业务逻辑并不总能带来可维护的解决方案。

添加了备注:如果您尚未使用PHP框架,请考虑发现laravel等产品的乐趣,它们可以提供task scheduling开箱即用的功能

答案 1 :(得分:1)

我建议采用另一种方法:

以下两种方式之一: 1)检查未结预订时,请务必添加支票WHERE createdat > NOW() - INTERVAL 30 MINUTE。 这样你只能仍然可以确认的预订 请注意,30分钟现在在查询/查询

中进行了硬编码

2)当时间变化时,您还可以考虑在表中添加一个额外的列:expiresat 插入预订时,您可以写下预订到期的时刻: INSERT INTO table (all, columns, expiresat) VALUES ('all', 'values', NOW() + INTERVAL 30 MINUTE) 通过这种方式,您可以改变每个订单的分钟数,或者让人们在晚上有更多的时间。

确认后,您可以将此列的值重置为null 你必须修改查询: WHERE expiresat > NOW() OR expirexat is null

在编程方面需要付出更多努力,但您不必担心必须运行以删除开放式预订的流程