【问题标题】:Why my code doesn't delete the $_SESSION variable?为什么我的代码没有删除 $_SESSION 变量?
【发布时间】:2023-04-01 10:52:01
【问题描述】:

我有一个文件,其中首先创建了 $_SESSION['username'] 变量:

 <?php

$kullaniciadi = $_POST['kullaniciadi'];
$sifre = $_POST['sifre'];

if ((!$kullaniciadi =="") and (!$sifre =="")) {
include("db.php");

$sql = $sqlt->query("select * from uye where kullaniciadi='$kullaniciadi' and sifre='".md5($sifre)."'");
$kayitsayisi = mysqli_num_rows($sql);

if ($kayitsayisi == "0") {
header ("Location: login.php?hata=yes");

}

 else {

$kontrol_ok = $sql -> fetch_assoc();
$k=$kontrol_ok["kullaniciadi"];

session_start();

$_SESSION['username']= $k;

header ("Location: homepage.php");
}
}
else {
header ("Location: login.php?hata=yes");
}
?>

它叫login_do.php(我将login.php表单中的MySQL数据发送到这里,并在这个文件中检查用户名和密码)。

与我拥有的所有其他 PHP 文件相比,我以:

<?php

session_start();

if (isset($_SESSION["username"])) {
echo 'loginok';
} else {
header ("Location: login.php");
}

?>

比我有一个logout.php,如果他按下按钮,用户就会被重定向到那里。 logout.php 文件包含以下内容:

<?php

session_start();

if(isset($_SESSION['username'])) {
    unset($_SESSION['username']);
}

session_destroy();

header("Location: login.php")

?>

但这根本行不通。我的意思是,如果我自己进入浏览器 cookie 并删除 SESSION cookie,那么是的,整个系统都可以正常工作,除非我登录,否则我无法访问除 login.php 之外的任何其他 php 文件。但我需要这个才能使用logout.php 而不是我自己手动从浏览器中删除会话。

【问题讨论】:

  • 我认为session_destroy() 部分将阻止unset 部分工作,因为PHP 在请求结束时序列化会话并且到那时它已被销毁。在这种情况下,当您再次启动它时,它将加载包含 $_SESSION['username'] 的先前会话数据
  • 也尝试了没有 session_destroy() 的相同代码,它不起作用。它让我疯狂。我在这里犯了什么错误。
  • 这里值得一提的是,无论成功与否,您的“login_do.php”都会始终设置 $_SESSION['username']。
  • 我更新了 login_do.php 文件。我想这可能是因为我给了你一个你认为的剪辑版。为什么它总是设置会话变量。

标签: php session cookies session-cookies


【解决方案1】:

session_unset();

session_destroy() 销毁与当前会话关联的所有数据。它不会取消设置与会话关联的任何全局变量,也不会取消设置会话 cookie。要再次使用会话变量,必须调用 session_start()。

为了完全终止会话,例如注销用户,还必须取消设置会话 ID。如果使用 cookie 传播会话 id(默认行为),则必须删除会话 cookie。 setcookie() 可以用于此。

--http://php.net/manual/en/function.session-destroy.php

【讨论】:

  • 嗨,我试过了:他们在你给我的 url 中给出的确切代码示例。我什至懒得更改任何变量,因为代码是销毁所有会话数据。但还是不行。
  • 它现在对我有用,就像 session_unset() 一样。我不知道消极情绪是怎么回事。我测试了代码并发布了它。
  • 我不是给你投反对票的人。我的地位不够高,不能投票给任何人。但是代码并不能解决我的问题。你知道为什么它可能不会删除我的会话变量吗?
  • header ("位置:login.php?hata=yes"); ?我们是否使用粘贴在浏览器位置的 get 变量将登录设置为 true?老实说,我从未见过这种用户验证方法。也许尝试不同的。抱歉,我无法提供更多帮助。
猜你喜欢
  • 1970-01-01
  • 2019-09-14
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 2020-10-09
相关资源
最近更新 更多