【问题标题】:I want to automatically logout a user when he/she closed the browser and if he/she clicked the back button of the browser [closed]我想在用户关闭浏览器并且单击浏览器的后退按钮时自动注销用户[关闭]
【发布时间】:2012-08-12 21:11:56
【问题描述】:

我的 logout.php 代码

<?php 
 $past = time(0); 
 setcookie(ID_my_site, gone, $past); 
 setcookie(Key_my_site, gone, $past); 
 header("Location: index.php"); 
 ?>

当他/她关闭浏览器并且他/她点击浏览器的后退按钮时,我需要在此代码中添加什么以便注销用户??

我的 login.php 代码

<?php 
$page = "login";
mysql_connect("localhost","root","");
mysql_select_db("nell");
 if(isset($_COOKIE['ID_my_site']))
 { 
    $username = $_COOKIE['ID_my_site']; 
    $pass = $_COOKIE['Key_my_site'];
        $check = mysql_query("SELECT * FROM users WHERE username = '$username'")or die(mysql_error());
    while($info = mysql_fetch_array( $check ))  
        {
        if ($pass != $info['password']) 
            {                       }
        else
            {header("Location: members.php");}
        }
    }
 if (isset($_POST['submit'])) { 
    if(!$_POST['username'] | !$_POST['pass']) 

    { header("Location: error.php");}

    if (!get_magic_quotes_gpc()) {
        $_POST['email'] = addslashes($_POST['email']);
    }
    $check = mysql_query("SELECT * FROM users WHERE username = '".$_POST['username']."'")or die(mysql_error());
 $check2 = mysql_num_rows($check);
 if ($check2 == 0) 

    { header("Location: error2.php");}

 while($info = mysql_fetch_array( $check ))     
 {
 $_POST['pass'] = stripslashes($_POST['pass']);
    $info['password'] = stripslashes($info['password']);
    $_POST['pass'] = md5($_POST['pass']);
if ($_POST['pass'] != $info['password']) 

        { header("Location: error3.php");}

     else 
 { 
     $_POST['username'] = stripslashes($_POST['username']); 
     $hour = time() + 3600; 
 setcookie(ID_my_site, $_POST['username'], $hour); 
 setcookie(Key_my_site, $_POST['pass'], $hour);   
 header("Location: members.php"); 
 } 
 } 
 } 
 else 
{    }
 ?> 

请帮忙,我想在用户关闭浏览器时自动注销用户,如果他/她点击浏览器的后退按钮。

【问题讨论】:

    标签: php session cookies login


    【解决方案1】:

    您无法在 PHP 中确定用户何时关闭浏览器 - 就 PHP 而言,页面被发送给用户,PHP 完成了它。

    您可以使用会话来更好地与用户机器联系,而不是使用 cookie。您可以执行一些操作,例如将会话超时设置为仅几分钟,但这可能会导致阅读速度较慢或花时间从一个页面移动到另一个页面的人将被锁定。

    如果您想在用户注销时成为一个真正的吝啬鬼,您可能必须在常规“签入”中执行类似 javascript'ing 的操作,将数据发送到服务器以保持会话处于活动状态 - 沿着较短的会话时间可能会达到您想要的结果。

    编辑:您发布的代码还显示了旧的mysql_* 函数,以及访问数据库的 root 用户和无密码。请死神告诉我您刚刚将该用户插入为占位符。其次,请继续使用 PDO 或 mysqli 以避免让您的网站被第一个恼火的用户淹没。

    您甚至没有检查包含“bob; drop table users;”用户名的$_POST 数据。这意味着我可以将其弹出,您的网站是 kaput。谷歌 SQL 注入,修复你的代码。马上。认真的。

    编辑 2:正如 Adnan 指出的那样,您可以将 cookie 到期日期设置为 0,这只会在会话打开时保留。我通常认为将用户名保存在 cookie 中很好,但让用户输入密码对安全性更好,您也可以采用这种方法。

    编辑 3:根据您的代码:

    <?php 
        $page="logout"; 
        $security=true; 
        session_start(); 
        if (!isset($_SESSION['EXPIRES']) || $_SESSION['EXPIRES'] < time()+3600) 
        { 
            session_destroy(); 
            $_SESSION = array(); 
        } 
        $_SESSION['EXPIRES'] = time() + 3600; 
        header("location: login_admin.php"); 
    ?> 
    

    为什么不按照以下方式设置会话变量:

    $_SESSION['isAdmin']=true;
    

    当他们登录管理功能并在退出管理功能时将其更改为false?无需终止整个会话,只需更改其中保存的单个变量即可。

    【讨论】:

    • 也可以将cookie过期时间设置为0,这意味着它将在会话结束时(浏览器关闭时)过期。
    • @Adnan 有趣,感谢您提供的信息,我一直使用 cookie 来存储长期信息,而不是短期信息。编辑答案。
    • 好的,问题来了。我有一个管理员用户和一个成员用户。我有相同的管理员和用户登录和注销代码。所以问题是当我登录到管理员页面并同时登录到用户时,当任何用户或管理员注销时,他们都将被注销,我为管理员和用户使用会话,所以我做的是,如果用户或管理员注销,我将用户的代码更改为不受影响。
    • @jolomendoza 听起来您正在为一些快速/懒惰的代码付费。如果您想确保管理员已注销,但用户仍处于登录状态,您将必须更改您的注销代码以包含“仅从管理员功能中注销我”之类的内容,而不是删除整个用户会话/cookie。
    • 啊,好吧..只有我需要为用户编辑的注销代码?它也会影响管理员注销页面吗?这是我的管理员注销代码
    【解决方案2】:

    您可以使用 javascript unload 事件作为触发器来回发到您的 PHP 代码。

    http://api.jquery.com/unload/

    【讨论】:

    • Unload 在用户离开页面的每一步都会被调用,包括重新加载和点击链接。这可能有点too gung-ho。您不希望用户单击页面上的有效链接(以移动到站点的其他方面)并被注销。缺少所有用户交互都通过 jquery 完成的页面,这可能行不通。
    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 2012-04-24
    • 1970-01-01
    • 2017-12-28
    • 2015-08-22
    • 2017-01-19
    • 2020-12-27
    相关资源
    最近更新 更多