使用重定向销毁会话

Destroy session with redirect

当我点击注销时 link 它重定向到一个空白页面。

这是 Login.php 文件:

<?php

    session_start();
    $_SESSION['logout']= 'username';

    include_once('config.php');

    if(isset($_POST['btn'])) {
        $username = addslashes($_POST['username']);
        $password = addslashes(md5($_POST['password']));

        $query = mysqli_query($connect, "SELECT * FROM register WHERE username = '$username' AND password = '$password' ")
        or die(mysql_error());
        $result = mysqli_fetch_array($query);

        if($result['username']==$username) {
            echo "You have successfully loged in <br>";
            $check = true;
        }else {
            echo "Wrong Login or Password <br>";
        }
    }

?>

<a href="logout.php">Logout</a>

Logout.php 文件:

<?php

    session_start();
    if(isset($_POST['logout'])) {
        session_destroy();
        header("Location:login.html");
        }
?>

请你更正我的代码并告诉我我做错了什么?

您注销时的这一行

if(isset($_POST['logout'])) {

应该使用 $_SESSION 而不是 $_POST

根据

$_SESSION['logout']= 'username';

您还将 MySQL API 与 or die(mysql_error()) 混合,应读作 or die(mysqli_error($connect))

我注意到您正在使用 MD5 存储密码;它很旧,被认为是坏了。

我推荐你使用CRYPT_BLOWFISH or PHP 5.5's password_hash() function. For PHP < 5.5 use the password_hash() compatibility pack

此外,关于 SQL injection which you are open to, use mysqli with prepared statements, or PDO with prepared statements它们更安全


请参阅 ircmaxell 的使用 password_hash() 和 PDO 与准备语句的解决方案:


error reporting 添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告只能在试运行中进行,绝不能在生产中进行。

问题出在您的 logout.php 文件中,您正在侦听 $_POST。

if(isset($_POST['logout'])) { ...

但是,您只是使用 link 的 href 到注销页面

<a href="logout.php">Logout</a>

这意味着永远不会有 $_POST['logout'] 因为它不是一个表单(而是一个实际的 link)。

因此,由于它是 link,您可以删除 if(isset($_POST['logout'])) { .. 并执行如下操作:

<?php

session_start();
session_destroy();
header("Location:login.html");

?>