重定向后不保存PHP会话变量?

时间:2012-11-29 04:32:56

标签: php session variables login session-variables

我似乎突然遇到一个奇怪的问题,我希望有人可能会有这样的建议......

我有一个登录脚本,如果登录失败,应该注册包含错误消息的会话变量,然后将用户重定向到他们来自的页面。例如,用户可能在index.php上使用了论坛并且登录失败并且它们被返回到index.php,其中脚本显示会话变量中包含的错误消息。

但是,会话变量似乎没有保存。为了记录,我在登录脚本中使用session_start()以及任何具有登录表单的页面,如果用户因登录失败而返回到该页面,则该页面应显示错误消息。

我的脚本如下:

if (isset($_POST['prev'])) {
  $prev = $_POST['prev'];
}
else {
  $prev = "login.php";
}
$_SESSION['Login_Error'] = $error;
header("Location: $prev");

然后表单页面上的脚本是:

if (isset($_SESSION['Login_Error'])) {
  echo $_SESSION['Login_Error'];
}

我得到的错误是:

Notice: Undefined index: Login_Error in F:\EasyPHP-12.0\www\index.php on line 3

关于为什么不保存的任何想法?如果登录成功,脚本将设置一个工作正常的用户ID会话变量。感谢您的任何建议。

3 个答案:

答案 0 :(得分:4)

我以前遇到过这个问题。如果在用户打开时设置了会话变量

www.domain.com/login.php

并将用户重定向到

domain.com/index.php(开头没有www。)

无法访问会话变量。确保www。或者总是在那里,从不在那里,或者你的脚本是否使用它取决于具体情况。

答案 1 :(得分:0)

如果你有unset($_SESSION['Login_Error'])或类似的话......比如$_SESSION['Login_Error'] = null,这可能会导致问题。

这是因为 - 在发送重定向标头之后 - 其余的php脚本继续执行。

如果在标题后面放置die()exit(),则应该停止执行脚本的其余部分,从而确保var在任何位置都不会被取消。脚本。

希望这会有所帮助。

答案 2 :(得分:0)

您需要在声明会话变量之前启动会话:

http://php.net/manual/es/function.session-start.php

此外,慢速机器上存在一个错误,目前无法保存会话变量。

尝试使用超时标头:

header("refresh:3;url=".$prev);

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Refresh

查看有关刷新标头的详情