【问题标题】:logging out in php ( cookies and sessions )在 php 中注销(cookie 和会话)
【发布时间】:2013-01-25 08:03:28
【问题描述】:

我在php中编写了登录和注销脚本。我可以登录但注销不起作用。请指出错误。我完全迷路了。这是完整的代码。

1.登录php代码:

    <?php
session_start();
require_once('login/connectvars.php');
$msg = "";

if(!isset($_SESSION['username']) && isset($_COOKIE['username']))
{
    $_SESSION['username'] = $_COOKIE['username'];
}

if(isset($_POST['submit']))
{
    $dbc = mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);
    $username = mysqli_real_escape_string($dbc,trim($_POST['username']));
    $password = mysqli_real_escape_string($dbc,trim($_POST['password']));

    if(!empty($username) && !empty($password))
    {
        $query = "SELECT username FROM users_dns WHERE username = '$username' AND password = SHA('$password')";
        $data = mysqli_query($dbc,$query) or die(mysqli_error($dbc));

        if(mysqli_num_rows($data) == 1)
        {
            $row = mysqli_fetch_array($data);
            $_SESSION['username'] = $row['username'];
            setcookie('username',$row['username'],time()+(60*6));
            $msg = 'success';
        }
        else
        {
            $msg = 'enter correct values..';
        }
    }
    else
    {
        $msg = 'Enter all fields..';
    }
}

?>

2.我在 HTML 中用于检查会话的代码。

   <div id="login_form">
          <h2>
            <?php echo $msg; ?>
          </h2>
       <?php
       if(isset($_SESSION['username']))
        {
            echo 'nothing<br />';
            echo '<a href="login/logout.php">log out'.$_SESSION['username'].'</a><br />';
        }
        else
        {
       ?>
         <form id="login"  method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
            <table>
                  <tr>
                     <th>Username:</th>
                     <th>Password:</th>
                  </tr>
                  <tr>
                     <td><input type="text" name="username" /></td>
                     <td><input type="password" name="password" /></td>
                   </tr>
                   <tr>
                      <td><input type="submit" name="submit" value="Log In" class="submit" /></td>
                      <td><a href="login/signup.php"><input type="button" class="submit" value="Sign Up" /></a></td>
                   </tr>
            </table>
         </form>
         <?php
         }
         ?>
    <!-- login form -->

   </div>

3.注销脚本

    <?php
session_start();

if(isset($_SESSION['username']))
{
    $_SESSION = array();

    if(isset($_COOKIE[session_name()]))
    {
        setcookie(session_name(),'',time() - 3600);
    }
    session_destroy();
}

setcookie('username','',time() - 3600);

echo 'redirecting you...please wait..';
header("Refresh: 3;url=http://localhost/");
?>

【问题讨论】:

  • 你为什么要这样做? $_SESSION = array(); ?你应该只使用setcookie('username', '', time()-1);
  • 我使用它是为了销毁所有会话变量..
  • 别这样……用session_destroy(),至于cookies,你应该用print_r($_COOKIE)看看谁留下了,为什么留下
  • 我删除了$_SESSION = array(); 但它仍然没有注销。 print_r($_COOKIE) 显示了很多我无法理解的信息
  • 只在此处发布,除非您在 cookie 中存储了一些密码

标签: php session cookies


【解决方案1】:

删除所有 cookie 试试。

<?php

if (isset($_SERVER['HTTP_COOKIE']))
{
    $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
    foreach($cookies as $cookie)
    {
        $mainCookies = explode('=', $cookie);
        $name = trim($mainCookies[0]);
        setcookie($name, '', time()-1000);
        setcookie($name, '', time()-1000, '/');
    }
}

对于session,您需要了解有关ob_start(); and ob_flush(); 的更多信息。 干杯。

【讨论】:

  • 它通过设置的 cookie 循环,只是将这些 cookie 的时间一一设置为过去......这就是诀窍......干杯......
  • 要删除 cookie,您只需再次设置 cookie,但时间已过期。
  • +1 供您询问答案...以及为什么要这样写答案...很高兴听到您只是不想回答但也想学习它...好...+1 +1 +1 +1 +1 为你...
  • 非常感谢。这令人鼓舞。还有一件事。是否可以将这段代码缩短一点..因为我还不太擅长 php..所以稍微少一点的代码会让我感觉更好..!!
  • 需要花时间来缩短此代码,但这是目前最好的方法...很快会为您提供更多替代方案...
【解决方案2】:

注销只需使用:

session_destroy();
header('Location: index.php'); // file name where you want to redirect after logout
exit();

【讨论】:

  • 但是还创建了一个需要销毁的COOKIE..??
猜你喜欢
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多