【问题标题】:Saving rooms in booking app在预订应用程序中保存房间
【发布时间】:2014-10-13 11:08:06
【问题描述】:

我有一些酒店预订网站。 符合条件的人可以选择酒店、日期和容量并为订单付款。

当客户做出决定并点击订单按钮时​​,会发生以下几步:

  1. 应用程序再次检查价格并收集订单信息

  2. 为客户节省房间以防止超额预订

  3. 客户订单窗口的计时器设置为 5 分钟(如果时间过去了,房间就会被释放)

如果客户端退出组织页面,则会触发 null_timer 并 已保存的房间被释放

如果客户开始订单(在订单页面),他不能处理其他 订单

  • $_SESSION['order_iddle']timer 更改触发自 客户端通过 ajax

JS 触发器

window.onbeforeunload = function(){ 

      timer_null();   
      return ""; 

}

PHP 检查

if ((!isset($_SESSION['order_iddle'])) || (!$_SESSION['order_iddle']) )  {

     header('location: https://home-page/');
     
}
  • $_SESSION['order_iddle'] 用 php 中的计时器更新。
  • timer_null() 向 php 发送 ajax 请求以更新/检查计时器

问题一:

此逻辑依赖于onbeforeunload() 函数,但如果该函数在某些浏览器中不起作用,我们就会遇到麻烦。当用户离开订单页面时,是否有更好的方法来触发timer_null()?也许在 PHP 中?

问题2:

onbeforeunload() 触发并且用户点击“留在页面上”时,timer_null() 无论如何都会触发。 有什么关系吗?

谢谢

【问题讨论】:

    标签: javascript php web-applications logic


    【解决方案1】:

    更好的选择是在您的后端为订单指定一个到期值。这样可以避免触发、用户不使用 JS 时出现问题、停留在页面时出现问题等。

    当他们下订单时,将值设置为当前时间加上分钟数:

    $order['expiry'] = time() + (5 * 60); // sets an expiry time for 5 minutes (5x60 seconds)
    

    然后在检查订单是否有效的未来页面上:

    if (time() > $order['expiry']) {
         throw new Exception('This order is not valid');
    }
    

    捕获该异常并根据需要将其返回给用户。

    更广泛使用的建议

    您的用例中可能还有其他需要保留的东西,例如,在这五分钟内需要持有库存。但是,如果您也将此到期时间合并到您的数据存储中,那么它可用于检查任何未来订单的到期时间。

    如果您不想在每次下新订单时都检查数千条可能过期的记录,您可以创建一种“清理”脚本来自动运行。如果您在我建议您阅读之前没有使用过crontab,而是使用 crontab 设置为每天午夜运行的脚本:

    0 0 * * * php /var/www/my-clean-up-script.php
    

    然后在脚本本身(伪代码):

    $expired_orders = database_query ( GET orders FROM table WHERE expired_time < current_time)
    for each $expired_orders
        database_query ( DELETE order)
    

    这适用于任何可查询的数据存储。

    【讨论】:

    • 谢谢,第一部分已经实现($_SESSION['order_iddle'] == $order['expiry'])。关于 cron 工作,这对我来说是最后的选择,因为我们不能等到晚上 php 将释放房间并每 5 分钟设置一次 cron ......好吧,它是一个很大的数据库......客户端触发的任何机会?
    • 正如您的问题和答案中提到的那样,无法保证客户端 JS 将正确执行。如果您只是检查时间是否更长,则不需要它成为客户端。 cron 作业是后来的建议,但简单的时间检查将适用于您所描述的用例。除非您的数据库每天要超过 100,000 条记录,否则我怀疑您会在每晚搜索一次时遇到问题。
    • 每晚搜索一次不是性能问题,只是在某个日期可能会有几间客房可供酒店使用,因此其他人将无法订购,直到所占用的房间被释放。是的,对于客户端触发器,我只剩下 10% 的希望)
    • 使用上面的代码,在订购时设置到期时间,然后在请求更多订单时进行检查,将在订单到期后 5 分钟提供房间。 cron 部分是稍后清理数据库的建议;原始代码符合您指定的用例。
    • 现在可以了,让我们等一个星期,找到一些错误)
    猜你喜欢
    • 2016-02-06
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多