0

我想在一些不涉及 cookie 的 PHP 应用程序中实现一个基本的登录系统。我的意思是,用户关闭浏览器并且登录过期,否则它将在浏览器会话期间(或者如果用户明确注销)保持活动状态。

我想记录所有这些活动,并且我认为每次用户刷新页面、打开不同的链接或注销时,我都会将该时间记录为该用户的最后一次访问,从而覆盖以前的访问日志。

但我的问题是我应该何时以及如何将另一条记录插入数据库而不是覆盖最后一条?

我应该只定义一个超时,如果最后一次访问是在该超时之上进行的,那么应该将另一个日志插入数据库吗?会话是否应该在超时后过期?

或者,还有更好的方法?

理想情况下,我想在浏览器关闭时记录“注销操作”,但我认为没有办法检测到它的存在吗?

建议?

4

3 回答 3

2

这里真正的问题是另一个问题。你为什么需要这个?我是说。在我看来这很容易:

  1. 您获取所有网站页面并在第一行添加类似session::recordAction()内容,然后在该方法中连接到数据库并记录来自time()本机函数的时间戳。将该字段放在数据库中的哪个位置并不重要,因为它基于您的设计偏好和架构。
  2. 当您想知道用户最近是否在线时,假设 10 分钟,您可以比较 2 个时间戳(您在数据库中记录的时间戳 和time()),然后这样说:

    if (session::getLastAction() < 10 * $minute) { /* 在这里做一些很酷的事情 */ }

  3. 如果您正在记录操作日志以在安全问题或其他情况下恢复它们,您必须记住该时间戳表示用户上次刷新页面的时间。在这种情况下,我建议您使用 .txt 文件来记录它们并记录 ip 以及您可以从该用户那里恢复的所有数据。因此,您不会无缘无故地过度使用数据库。

如果您正在为其他目的构建此系统,请告诉我,我会让您知道如何用这种方式解决您的所有问题。

提示

请记住,实际上几乎没有人真正按下注销按钮,他们只是离开了网站。如果他们要离开网站,就没有办法真正知道这一点。事实是他们没有向服务器请求页面,如果 1. 他们离开了网站或 2. 如果他们正在阅读网页并且没有刷新,则可能会发生这种情况。

注意

如果我没有弄错,您正在寻找某种方法来制作登录系统并且您担心 cookie:

  • setcookie()浏览器关闭后Cookie 过期(默认情况下,使用)。您可以通过设置过去的时间戳来删除它们,并且可以设置一个非常长的日期使它们永远存在。它们非常有用,并且仍然被很多人使用。
  • 会话在 24 或 22 分钟不活动后过期(不确定,谷歌它)。

我希望我是可以理解的,如果不只是要求澄清的话。:)

于 2011-01-03T02:31:49.310 回答
1

在这里稍微修改一下我的答案,因为您已经提到了服务器端超时……

您唯一可以在客户端做的事情是使用 onbeforeunload 事件来调用注销页面(如果用户没有单击文档中的链接..)

不幸的是,浏览器的后退、前进和刷新按钮会导致注销...
要解决此问题,请让您的 logout.php(自动注销页面)休眠 20-30 秒,然后检查最后一次印象是否低于30-45 秒前在注销之前...</p>

只需将此添加到文档头部的脚本标签,然后将“logout.php”更改为您想要的任何内容... * 如果您使用链接以外的其他内容,您可能还需要编辑 window.onload 函数以正确添加 onclick 处理程序导航…。

    var xmlhttp=false; var target; var combo;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }
@end @*/
if (!xmlhttp && typeof XMLHttpRequest!='undefined') { 
    xmlhttp = new XMLHttpRequest(); 
}
var dologout = true;
var logouturl = 'logout.php';
window.onbeforeunload = function() { 
    if (dologout) {
        xmlhttp.open("POST", logouturl, true); 
        xmlhttp.send(null); 
    }
}
window.onload = function() { 
    for (i=0;i<document.links.length;i++) 
    document.links[i].setAttribute("onclick","dologout = false;"); 
}

本质上,这只是将 onclick 事件附加到所有 document.links 并在单击文档链接时将“dologout”标志更改为 false ...

如果在 onbeforeunload 事件触发时 dologout 标志为真,它会发送一个帖子到 'logouturl' / 'logout.php' ...

于 2011-01-03T02:15:40.200 回答
-1

当浏览器关闭时,无法触发对您有价值的操作。http://www.webdeveloper.com/forum/showthread.php?t=93810在这个链接上,一个用户问了一个类似的问题,他遇到的问题,我怀疑你会遇到的问题是,每次用户离开网页时被认为是他们正在离开该站点,因此这会干扰您的日志记录活动。我只会使用 cookie 并让它们经常过期。每次他们在您的网站上执行一些有用的操作时记录用户操作,即.. 点击一个链接,而不是关注他们花多少时间阅读内容。

于 2011-01-02T20:47:22.203 回答