0

我的 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 
{    }
 ?> 

请帮助,当他/她关闭浏览器并且他/她单击浏览器的后退按钮时,我想自动注销用户。

4

2 回答 2

3

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

您可以使用会话来更好地与用户机器联系,而不是使用 cookie 。您可以执行诸如将会话超时设置为仅几分钟之类的操作,但这会冒着阅读速度较慢或花时间在页面之间移动的人将被锁定的风险。

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

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

您甚至没有检查$_POST包含用户名“bob; drop table users;”的数据。这意味着我可以将其弹出,您的网站是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退出管理功能时?无需终止整个会话,只需更改其中保留的单个变量。

于 2012-08-12T12:39:59.827 回答
-1

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

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

于 2012-08-12T12:48:35.363 回答