【问题标题】:Delete Query should execute after session is automatically destroyed删除查询应在会话自动销毁后执行
【发布时间】:2012-12-30 11:04:43
【问题描述】:

我遇到了会话销毁问题。我正在该文件中运行一个名为 logout.php 的脚本,我正在破坏用户会话,我正在执行一个查询,该查询将删除我的购物袋。这工作正常,但是当我关闭浏览器或会话在某个时间后自动销毁时,那时我必须删除我的购物袋,当然在这种情况下 logout.php 不会调用。那么我怎样才能做到这一点。

logout.php :-

<?php
include_once('functions/config.php');
session_start();


$sql = "DELETE FROM baskets WHERE member_id = '".$_SESSION['memid']."' ";

mysql_query($sql);

session_destroy();   


header('location:index.php')

?>

【问题讨论】:

  • 因此,简而言之,您希望在浏览器关闭或会话被破坏时执行查询。对吗?
  • 请不要再使用mysql_* 扩展名,它已被弃用。手册页将告诉您改用什么(PDO 或 mysqli_*)。最好是PDO,因为它不仅支持mysql,而且更符合时代(OO API)

标签: php mysql session


【解决方案1】:

对于这个问题,我有两个答案: 1)您可以使用javascript事件window.onbeforeunload清除您的购物袋 示例:

     window.onbeforeunload= function(){
        // your ajax call to clear shopping bag
     }

2)我会推荐这个选项: 您可以在用户登录时清除用户购物袋。

【讨论】:

  • 感谢@sumit souda,现在我正在删除我的购物袋,当用户登录以及点击注销链接时。
  • 我遇到了类似的问题,但 onbeforeunload 不够可靠,无法清除商品库存有限的购物车。移动浏览器(例如 iOS Safari)或 Opera 不支持它。
【解决方案2】:

没有办法编写可以安全地假定它在会话被销毁时调用的代码。

做你想做的最简单的方法是在你的购物篮上设置一个“最后访问”的时间戳,你每次访问都会更新,然后每隔一小时左右运行一个 cron 作业(计划的作业),以删除所有没有的购物篮比方说,6 小时或更长时间都没有被访问过。这不会在会话超时的同时将其删除,但从长远来看会将旧篮子保留在数据库之外。

【讨论】:

  • 这也是我想做的。可悲的是,cron 工作有点超出我的范围。但我似乎无法绕过它。
  • @eggyal 你的答案在哪里??
  • @J4GD33P51NGH:我的答案不是我想的解决方案,所以我删除了它。
  • @eggyal 表示无法对会话销毁执行数据库查询?
【解决方案3】:

您确定要在(例如)用户浏览器关闭时清理购物袋吗?您可以发出警告,例如“您上次没有正确注销,您想继续购物还是重新开始?” ,类似的东西。

HTTP 是一种无状态协议,因此您无法判断浏览器何时真正关闭。在我看来,您需要处理会话超时,以便在经过一段时间后,购物袋无论如何都会被清除,除非仍有用户活动。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 2015-03-20
    • 2020-04-27
    • 2015-11-26
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多