做了一个免费看小说的网站,结果出了一个非常怪异的问题,就是登录以后,无论如何也退不出去(大约有几次却可以退出),goole,baidu,csdn上N多的帖子和解决办法都试过了,还是不行,实在没辙了,各位大大救命啊!网站名字是第二中文网,地址是 http://www.dearzw.com ,大家可以去实际操作一下看看。下面贴出几段相关的代码:login.php
 <?php
header("Content-Type:text/html; charset=utf-8");
session_start();
require_once('database.php');
if(isset($_POST['u'])){
    $user = $_POST['u'];
    $pwd = md5($_POST['p']);
 }else if (isset($_COOKIE['user']) && !empty($_COOKIE['user'])){
   $userInfo = explode(',',$_COOKIE['user']);
      $user = isset($userInfo[0]) ? $userInfo[0] : '';
      $pwd = isset($userInfo[1]) ? $userInfo[1] : '';
 } else{
   return ;
 }
 $msg=  '';
 $db = new Database();
 $userdata = $db->query("select uid from user where uname='".$user."' and pwd = '".$pwd."'");
 $userid = each($userdata);
 $count = count($userid[1]);
 if(!$count>0) {
     $msg=  'error';
 } else {
     $_SESSION["user"]=$user;
     if (isset($_POST['a']) && $_POST['a'] =='true'){
         setcookie("user", $_POST['u'].','.md5($_POST['p']), time()+60*60*24*1000,'/','.dearzw.com');
     }
     $msg= 'ok';
 }
 if (isset($_POST['f']) && $_POST['f'] == 1){
     echo $msg;
  }
 ?>
logout.php
<?php
 session_start();
 setcookie("user",null);
 setcookie("PHPSESSID",null);
 $_SESSION['user']=null;
 unset($_SESSION['user']);
 unset($_COOKIE['user']);
 session_destroy();
 header("Set-Cookie:user=");
 header("location:index.php");
 ?>
退出时调用的JavaScriptfunction doQuit(){
  delCookie("user");
  $.get("/logout.php");
}

解决方案 »

  1.   

    js返回的是index.php的内容,实际上已经退出了的,只是页面没处理。建议jquery获取logout.php成功以后做一个刷新操作。或者logout.php返回一个数据 告诉JS退出成功,显示登录的表单
      

  2.   


    以前js是这么写的function doQuit(){
      delCookie("user");
      $.get("/logout.php");
      location.reload();
    }
    一样没有效果
      

  3.   

    logout.php<?php
     session_start();
     setcookie("user",null);
     setcookie("PHPSESSID",null);
     $_SESSION['user']=null;
     unset($_SESSION['user']);
     unset($_COOKIE['user']);
     session_destroy();
     header("location:logout.php");
     ?>改成这样试试。
      

  4.   

    谢谢各位的回答,问题还是无法解决。伤心ing...
      

  5.   

    session_start();
    session_unset();
      

  6.   


    这样不行,现在logout.php改成下面这样了,好像在ie里面可以了,但是firefox依然不行。 <?php
      2  session_start();
      3  $_SESSION['user']=null;
      4  $_COOKIE['user']=null;
      5  unset($_SESSION['user']);
      6  unset($_COOKIE['user']);
      7  session_unset();
      8  session_destroy();
      9  session_regenerate_id();
     10  setcookie("user",'', time() - 3600*24,"/");
     11  ?>
      

  7.   

    把cookie存的session_id置空也不是不可以
    不过不知道你的
    setcookie("user",'', time() - 3600*24,"/");
    是为哪般
    应该是
    setcookie(session_name(),'', time() - 3600*24,"/");
      

  8.   


    session_name()取得的值就是“user”,所以两者是一样的效果,我换成session_name()也不行。
      

  9.   

    <?php
     session_start();
     setcookie("user",null);
     setcookie("PHPSESSID",null);
     $_SESSION['user']=null;
     unset($_SESSION['user']);
     unset($_COOKIE['user']);
     session_destroy();
     header("Set-Cookie:user=");
     header("location:index.php?t=".time());
     ?>
      

  10.   


    session_start();
    unset($_SESSION['user']);
    setcookie("user", '', 1000,'/');
      

  11.   

    你用的是ajax异步调用sesson destroy页面
    其实一般session_destroy()就行了,我怀疑你ajax发送请求到session删除页面,有的浏览器认为是另外一个会话,这样session_start()启动的是另一份session文件
    实在不行,你可以试试这样
    function doQuit(){
      delCookie("user");
      $.get("/logout.php?sess_id=当前的session_id");//把session id通过url传过去
    }然后在logout.php
    <?php
    session_id($_GET['sess_id']);//保证启动相同的会话
    session_start();
    session_destroy();
    ?>
      

  12.   

    还不行,你试下从"退出"那个按钮直接链接到logout.php,而不是通过ajax发送请求。
      

  13.   

    logout.php 
    有可能是缓存的问题.
    logout.php中,加入
      header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
      header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
      header("Cache-Control: no-store, no-cache, must-revalidate");
      header("Cache-Control: post-check=0, pre-check=0", false);
      header("Pragma: no-cache");
      

  14.   

    jakey说得有道理ajax发送请求一般都附上一串随即码,以避免请求缓存页面。function doQuit(){
      delCookie("user");
      $.get( "/logout.php?t="+(Date.parse(new Date())) );
    }
      

  15.   


    直接调用logout.php也不行,现在代码还没改,你可以试一下
      

  16.   

    呵呵,算了,还要注册用户。
    试试直接链接,然后试试jakey的方案
      

  17.   

    MARK 明天学习SESSION 传值
      

  18.   

    没有人遇到过同样的问题吗?session、cookie,cache该清除的都清除了,还是退步出来,真是见鬼了!
      

  19.   

    你先去掉COOKIE相关代码,看看是不是他的问题还是session问题,
      

  20.   

    你测试一下啊 你退出的时候有没有执行删除SESSION  设置一个断点看一下子嘛!
      

  21.   


    因为服务器环境是linux+nginx,本地没有环境,所以没有在本地测试。
      

  22.   


    在logout.php画面上echo $_SESSION['user']的结果是空的,但是到前台后不知道什么原因就又有值了
      

  23.   


    估计还是cookie的问题,因为我的处理步骤是,退出时通过logout.php 清除cookie和session变量,完了页面跳转到主页,主页打开时会自动执行login.php,login.php里面会检测cookie中是否保存有用户的登录信息,如果有的话,就自动登录,没有就什么也不做。
    现在问题是在logout.php画面上echo $_SESSION['user']的结果是空的,但是页面跳转到主页时,不知道为何就自动登录了。
      

  24.   

    哪就说明你的login.php的问题了.
    logout.php已经完成了清除的使命.
    这主要多测试,一步一步的来,建议以写日志的形式,追踪问题出现的地方,不是三言二语能说明的.
    查明出现问题的位置更重要,要不始终是走弯路.
      

  25.   

    其实你完全可以做更多的测试,比如手工清除客户端的cookie,手工删除服务器的session文件,
    利用工具,追踪数据.做网页抓取的时候,都是一步一步来做的.
    这方面ff做的比较好!
      

  26.   


    手动删除客户端cookie以后,再退出就可以了,但是问题就是不知道是在哪一步又重新给cookie赋了值
      

  27.   

    可以肯定的是
    logout.php 
    PHP code
    <?php
     session_start();
     setcookie("user",null);
     setcookie("PHPSESSID",null);
     $_SESSION['user']=null;
     unset($_SESSION['user']);
     unset($_COOKIE['user']);
     session_destroy();
     header("Set-Cookie:user=");
     header("location:index.php");
     ?>
    都session_destroy()这样以后,session是肯定销毁掉了的,再定向到index.php,那就要看你index.php的验证是否登陆的代码了,是AJAX+cookie验证吗?还是只是验证一下cookie,其实你只要在index.php里面测一下就知道,打印一下session与cookie,看看通过重定向过到index.php后输出的session与cookie是否还存在就知道了,晕咯,真是搞这么麻烦
      

  28.   


    从logout.php 转到index.php 时,我在login.php里面输出了一下$_COOKIE和$_SESSION,但是不幸的是,这两个变量里面的值全部都在!根本就没有被清除,不知道logout.php里面的操作为什么会没有起作用?
      

  29.   

    真的是活见鬼了!刚才又试验了一下,在logout.php最后面输出了一下$_COOKIE和$_SESSION,里面相关的数据确实已经清除掉了,但是在login.php里面输出$_COOKIE和$_SESSION发现里面的值还是存在,真实奇了怪了!
      

  30.   

    Warning: session_destroy(): Session object destruction failed in xxxxx为什么会出现这个问题呢 ?这是因为要写session的文件夹的权限够,请给everyone完全控制权限即可解决。