真烦人的问题我无法解决/只能部分解决。适合你的好多汁。
我已经设置了基本的登录系统。像这样:
的login.php:
session_start();
if($_SESSION['logged_in'] == true) header("Location: /controls.php);
,如果他们已经输入了详细信息。$_SESSION['logged_in'] = true;
header("Location: /controls.php);
请记住,会话现已设定。
Controls.php
session_start();
if($_SESSION['logged_in'] != true) {header("Location: /index.php");}
我立即被带到了CHROME和FIREFOX的index.php。
另外,我有accounttools.php
,再次需要会话。一旦我尝试访问accounttools.php
,会话就被销毁/取消设置,任何加载accounttools.php
的尝试都会导致标题重定向到我的/index.php页面,再次只能在FIREFOX和CHROME中。
我还要加入一些东西。如果我回到login.php
并重新登录,一切正常,会话设置正确。这是一个基于浏览器的错误吗? PHP是在任何数据发送到浏览器之前执行的,那么如果PHP在任何事情到达用户时已经被执行了,那么这些浏览器的行为方式如何呢?
登录文件:
// Login.php
<?php session_start();
if($_SESSION['logged_in'] == true)
{
header("Location: /controls.php");
exit();
}
if($_POST['username_login'] && $_POST['password_login'])
{
// Do necessary database work to check credentials (edited out here).
// ...
// Check re-hashed pass against database hash (password checking)
if($make_password == $current_user[0]['password'])
{
// If this is OK login is a success.
$_SESSION['logged_in'] = true;
header("Location: /controls.php");
exit();
}
}
?>
控制文件:
// controls.php
// This page instantly redirects to index.php
<?php session_start();
// Go to homepage if logging out.
if($_POST['logging_out'])
{
unset($_SESSION['logged_in']);
header("Location: /index.php");
exit();
}
// No access unless logged in.
// This session seems to no longer exist at this point. Why??
if($_SESSION['logged_in'] != true)
{
header("Location: /index.php");
exit();
}
?>
编辑:我发现了其他内容:如果我登录并手动输入$_SESSION
限制页面的网址,则$_SESSION
不会被销毁。
header()重定向的某些部分导致在Google和Mozilla中取消设置/销毁$_SESSION
。
我也像疯子一样谷歌搜索,显然这是PHP编码器中常见的问题。有人必须知道这是什么?
答案 0 :(得分:1)
我看到成功登录后重定向的方式存在问题:这是一个javascript重定向,所以它只会在所有php完成执行并且结果已发送到浏览器后才会发生。这意味着重定向后的代码也会被执行。
我建议不要在浏览器输出任何内容之前使用:
header("Location: /...");
exit();
组合到任何想要重定向的地方,这样您就可以确保在重定向代码之后会话没有任何反应。
为避免出现headers already sent
问题,我还建议您删除以下内容:
?>
<?php
就像login.php
的第一行一样。