Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 保留行4分钟,如果未采取任何操作,则删除_Php_Mysql_Forms - Fatal编程技术网

Php 保留行4分钟,如果未采取任何操作,则删除

Php 保留行4分钟,如果未采取任何操作,则删除,php,mysql,forms,Php,Mysql,Forms,我正在使用php/mysql构建一个预订系统,我试图弄清楚如何在最终用户输入预订的详细信息时保持一行4分钟,以避免人们同时预订同一张票。如果他们离开页面,4分钟计时器结束后,“持有”该票据的记录将被删除 我一直在考虑安排一个活动在他们到达初始页面4分钟后运行,但是当他们完成信息页面并完成预订时,该活动应该取消。我在这个问题上搜索了很多,只找到了安排未来活动的方法,而没有“保留”记录 我还认为可以创建一个唯一的临时值,以便在4分钟后查找事件(即名称列中带有'DELETE4MINS'的varchar

我正在使用php/mysql构建一个预订系统,我试图弄清楚如何在最终用户输入预订的详细信息时保持一行4分钟,以避免人们同时预订同一张票。如果他们离开页面,4分钟计时器结束后,“持有”该票据的记录将被删除

我一直在考虑安排一个活动在他们到达初始页面4分钟后运行,但是当他们完成信息页面并完成预订时,该活动应该取消。我在这个问题上搜索了很多,只找到了安排未来活动的方法,而没有“保留”记录

我还认为可以创建一个唯一的临时值,以便在4分钟后查找事件(即名称列中带有
'DELETE4MINS'
的varchar)。但是,我觉得应该有更好的方法来实现这一点,并且处理预订票据的行中没有一行包含varchar元素

我有以下表格保存机票预订信息:

CREATE TABLE reservations(
    rid int NOT NULL AUTO_INCREMENT,
    aid int NOT NULL,
    approval tinyint(1) NOT NULL,
    creationTime TIMESTAMP 
        DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (rid),
    CONSTRAINT UQ_RESERVATION_COMPOSITE UNIQUE(rid, approval),
    FOREIGN KEY (aid) REFERENCES accounts (aid)
        ON DELETE CASCADE
);

CREATE TABLE reservedTickets(
    rid int NOT NULL,
    tid int NOT NULL,
    hid int NOT NULL,
    approval tinyint(1) NOT NULL,
    PRIMARY KEY (tid),
    FOREIGN KEY (rid, approval) REFERENCES reservations (rid, approval)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (tid) REFERENCES tickets (tid)
        ON DELETE CASCADE,
    FOREIGN KEY (hid) REFERENCES people (hid)
        ON DELETE CASCADE
);

我完全看不出有任何理由实际删除该条目。基本上,当用户请求保留时,您所要做的就是在DB中创建一个带有当前时间戳的保留。成功后,您将向他们展示某种计时器(使用JS),该计时器将向他们显示剩余时间。当用户提交表单时,唯一需要做的就是将当前时间与数据库中的时间戳进行比较,如果已经超过4分钟,则抛出错误。如果出于某种原因确实要删除该条目,则可能需要运行CRON作业,该作业将每n分钟运行一次,并删除所有“过期”行。或者,在最坏的情况下,您可以在每次有人访问服务时执行该操作(这将是页面代码的一部分),尽管这不是一个好主意


编辑:您可以在显示所有票据的页面上执行删除查询。流程如下:一旦有人访问带有票证列表的页面,所有过期的条目都将被删除,而您只向他们显示未保留的票证。这将确保人们只能看到那些可访问但尚未过期的内容

如果可能,我希望避免使用cron作业。我知道我可以每5分钟左右运行一次并删除过期条目。然而,为了我自己的理智,我更愿意将它嵌入SQL中。利益分离需要删除该行的原因是前端显示系统中已批准和挂起的票据。如果持有票据的行未被删除,则在票据被清除之前,其他人将无法请求该票据。通常有200-300人同时试图预订30-40张票,周转非常重要。在这种情况下,每次有人访问页面时执行删除操作是一种方法。但这可能会影响性能。还有其他解决方法,例如运行一个单独的页面,每4分钟刷新一次并删除所有行,但这甚至是令人担忧的。幸运的是,我过度配置了这个服务器12GB RAM和6个内核来处理并发访问。性能不应该是个大问题。然而,这让我回到了最初的问题,即如果在4分钟内没有采取任何行动,我如何安排删除操作。我真的看不到客户端有什么方法可以这样做。您可以添加一些JS代码,将它们重定向到执行删除操作的页面,但它们可以禁用javascript。因此,我的猜测是在显示所有票据的页面上执行删除查询。流程如下:一旦有人访问带有票证列表的页面,所有过期的条目都将被删除,而您只向他们显示未保留的票证。这将确保人们只能看到那些可访问但尚未过期的内容