每当我重新加载页面时,仍会设置取消设置 PHP 会话变量 [重复]

Posted

技术标签:

【中文标题】每当我重新加载页面时,仍会设置取消设置 PHP 会话变量 [重复]【英文标题】:Unsetting a PHP session variable is still set whenever i reload the page [duplicate] 【发布时间】:2019-08-03 17:36:25 【问题描述】:

我的问题是当我取消设置会话变量然后重新加载 login.php 时,会话变量仍然设置。

这是我想要做的:

我正在尝试通过在 reset.php 中设置的会话变量发送错误消息

<?php
session_start();
$_SESSION['reset-msg'] = "This link has already been used";
header("Location: $urllogin.php");
exit();
?>

Login.php 应该检查是否设置了此会话,然后显示错误消息并取消设置会话变量。

<?php
session_start();

if(isset($_SESSION['reset-msg']) && !empty($_SESSION['reset-msg']))

   print_r($_SESSION);//prints "Array ( [reset-msg] => This link has already been used )"
   $warn_msg = $_SESSION['reset-msg'];
   $_SESSION['reset-msg'] = "";
   unset($_SESSION['reset-msg']);

else
   $warn_msg = "";

print_r($_SESSION);//prints "Array ( )"
exit;
?>

但是,每次重新加载 login.php 时,我仍然收到相同的消息。

日志文件中显示的唯一错误

PHP 警告:session_start(): 无法发送会话缓存限制器 - 第 2 行 /login.php 中的标头已发送(从 /login.php:1 开始输出)

【问题讨论】:

错误信息表明你在调用session_start()之前有一些输出。首先移动session_start(),在任何输出之前(包括换行符/空白等)。 旁注:您不需要在相同的 if 条件下同时使用 isset()!empty()。只需拥有!empty() 就足够了,因为它检查与isset() 相同的内容以及更多内容。 错误消息表明session_start() 失败,这肯定会导致您尝试设置会话变量时出现问题。从第 1 行开始的输出表明您有一些 之前 &lt;?php。它可能是一个字节顺序标记 session_start()之前删除输出的提示见this answer 如果您仍然遇到同样的错误,那么您的&lt;?php-tag 之前可能有一个空格或换行符。另外,请确保您的文件保存为 UTF-8 而不是 with BOM 【参考方案1】:

使用 session_destroy 或将会话索引定义为空白

【讨论】:

我尝试了 session_destroy 而不是取消设置,但仍然没有破坏会话。但是我在日志“session_destroy(): Trying to destroy uninitialized session”中得到这个错误【参考方案2】:

使用以下内容。它会破坏会话

session_start();
session_unset();
session_destroy();
header('location:your-desired-location.php');

【讨论】:

OP 想要取消设置 一个 会话变量,而不是核对整个会话

以上是关于每当我重新加载页面时,仍会设置取消设置 PHP 会话变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

更新 redux 状态/提交表单时页面重新加载

取消Mediawiki登录以防止会话劫持

从 javascript POST 重新加载剃须刀页面

PHP 为啥 $_SESSION 变量拒绝在浏览器关闭时取消设置?

为啥自定义指令不能立即反映其代码的变化

UwAmp 重启会导致 Chrome 页面崩溃