PHP逻辑比较购物车中的会话ID?

时间:2015-04-23 13:38:18

标签: php shopping-cart

我已经使用PHP在大学项目上创建了一个购物车,我可以添加到项目中的链接到购物车,这将更新我的数据库中的购物车表,然后打印出来。

我希望能够在用户退出页面或关闭浏览器后删除表格中的eveything(我认为这是会话ID更改的时候)。但我不能想到这样做的逻辑?

欢呼声

3 个答案:

答案 0 :(得分:1)

通常这样做是为了跟踪用户的上一次活动。

每次任何用户打开页面时,都会在数据库中检查所有已记录用户的last_log条目。如果一个用户上次执行某项操作的时间超过N分钟,则该会话将过期。然后,您可以将用户注销并删除其项目。

您可能会提出这样的问题:"如果当前没有用户打开网页会怎样?没有人可以触发代码的执行"。在这种情况下,也没有人有兴趣知道任何购物车的内容,桌子可以保持填充。要解决此问题,使用此解决方案,您可能需要在服务器上运行计划任务。

以下是步骤摘要:

...
Retrieve the list of expired sessions since the last check
For every expired session
    Remove the items from the shopping cart
Update the last_log entry for the current user
...

检查所有用户听起来像是一项昂贵的操作,但你必须考虑以下几点:

  1. 一个SELECT找到要注销的人(如果需要)和一个UDPATE来注销
  2. SQL已优化为仅更新所有可能用户的子集
  3. 该表将有相关字段的索引以加快流程
  4. 您在会话超时窗口中当前有多少用户?最糟糕的情况是半小时内有100.000个用户。对于RDBMS来说,通过它们并不是什么大不了的事。
  5. 以下是一个示例SQL(没有特定语言):

    -- Used to check which user session have expired since the last check
    SELECT username FROM session_table WHERE last_log < SUBTRACT(DATE(), 30 MINTUES) AND logged = 'true';
    
    -- Used to log out the users after the timeout
    UPDATE session_table SET logged = 'false' WHERE last_log < SUBTRACT(DATE(), 30 MINTUES) AND logged = 'true';
    
    -- Used to update the last_log entry for the current user
    UPDATE session_table SET last_log = DATE() WHERE user_id = "...";
    

    您可以使用Cookie或会话执行此操作,但我更喜欢数据库,因为它可以避免处理PHP会话跟踪并允许您执行更复杂的操作,例如,如果您希望保留&#34;后&#34;或&#34;草稿&#34;项目清单。

    更新:我对logid和DB / SQL部分做了一些澄清。

答案 1 :(得分:0)

你可以&#34;清除&#34;你的桌子使用一些时间逻辑。

例如,当您的用户返回您的页面时(您可以使用$ _SESSION,$ _COOKIE,$ REMOTE_ADDRESS等进行验证),如果该用户返回第二个&#39;视图是在,也许是2天后,您可以清除&#39;那些数据。或者,您可以创建一份“工作”。在您的数据库中,检查用户上次访问您的网页的时间(列&#39; last_login&#39;),然后再次删除该用户添加的卡内的任何产品。

答案 2 :(得分:0)

当用户关闭浏览器时,您可以使用JavaScript向服务器发送AJAX请求,您可以使用Javascript事件&#34; onBeforeUnload&#34; 进行检查。这样,脚本将确保仅在用户离开网站时删除会话和数据库记录。

<script type="text/javascript">
    $(window).on('beforeunload', function() {
        $.ajax({
          url: /yourfileDeleteSession.php
        });
    }); 
</script>