【发布时间】:2013-08-27 15:20:48
【问题描述】:
我的网站有一个登录脚本,可以检查 mysql 表中的用户数据。该表有几列(名称、用户名、密码等),最重要的(为了这个问题)是“用户名”和“在线”列。 “在线”列是一个 BOOL 值(在线为真时为 1,为假时为 0)。当用户成功登录时,$_SESSION 变量被设置为他们从表中获取的数据,我使用以下内容将表中的“在线”值从“0”更改为“1”。
mysql_query("UPDATE Members SET Online='1' Where UserName='$username' AND Online='0'");
脚本检查 'online' 的值,如果它为 1,则他们无法登录,并回显一条消息,说明用户已登录。
接下来,该站点的每个页面都有一个“注销”链接,该链接运行一个脚本,该脚本取消所有 $_SESSION 变量的设置并将在线值从 1 更新回 0。
mysql_query("UPDATE Members SET Online='0' Where UserName='$username' AND Online='1'");
这就是问题所在。如果用户关闭浏览器窗口,由于 php 的功能,会话会自动结束,这很好,因为这就是我想要发生的事情。但是,如果浏览器关闭,我还想更新表格。否则,当用户关闭浏览器时,他们将无法重新登录,因为他们的在线值仍然是 1。我知道使用 onunload 或 onbeforeunload 将不起作用,因为每次刷新或换页。我知道我可能需要使用某种会话超时,但是我看到的每个答案都没有完全解释如何去做。我通常只看到人们发布代码而没有解释它是如何工作的或应该如何使用它。如果有人能帮我解决这个问题,我将不胜感激。
提前致谢。
【问题讨论】:
-
听起来您将“在线”和“登录”视为同一个意思。如果是这样,我不会在数据库中复制登录状态,而只是检查是否设置了 $SESSION cookie 以确定它们的登录状态。
-
是的,这不是大多数网站使用登录的标准方法。他们大多只使用会话。我的建议是忘记使用表来存储“登录”与否。正如您所发现的,如果有人关闭了他们的浏览器,您将无能为力。
-
感谢您的建议,但是,在我的主页上,我喜欢显示当前在线的用户。我不需要将这些数据存储在数据库中,还是有其他方法可以做到这一点?我对 php/mysql 还很陌生,所以我想尽我所能获得帮助。阅读教程和手册只会让我到目前为止。我喜欢从其他人的经历中听到解决方案。非常感谢所有帮助。
标签: php browser timeout sql-update logout