【发布时间】:2019-08-03 17:36:25
【问题描述】:
我的问题是当我取消设置会话变量然后重新加载 login.php 时,会话变量仍然设置。
这是我想要做的:
我正在尝试通过在 reset.php 中设置的会话变量发送错误消息
<?php
session_start();
$_SESSION['reset-msg'] = "This link has already been used";
header("Location: {$url}login.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 行开始的输出表明您有一些 之前<?php。它可能是一个字节顺序标记 -
在
session_start()之前删除输出的提示见this answer -
如果您仍然遇到同样的错误,那么您的
<?php-tag 之前可能有一个空格或换行符。另外,请确保您的文件保存为 UTF-8 而不是with BOM。