1

我无法解决/只能部分解决的非常烦人的问题。多汁的一款适合您的专业人士。

我已经建立了一个基本的登录系统。像这样:

登录.php:

  1. 第 1 行:session_start();
  2. 检查if($_SESSION['logged_in'] == true) header("Location: /controls.php);,如果他们已经输入了他们的详细信息。
  3. 如果他们尚未输入,用户输入凭据(如果有效):$_SESSION['logged_in'] = true;
  4. 检查数据库凭据并将会话设置为 true 后,使用 PHP 重定向header("Location: /controls.php);

请记住,会话现已设置。

控制.php

  1. 第 1 行:session_start();
  2. 第 2 行:if($_SESSION['logged_in'] != true) {header("Location: /index.php");}

立即我被带到 index.php 只有在 Chrome 和 Firefox 中。

另外,我有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-restricted 页面的 URL,$_SESSION则不会被破坏。

header() 重定向的某些部分导致 th$_SESSION在 Google 和 Mozilla 中被取消设置/销毁。

我也疯狂地在谷歌上搜索,显然这是 PHP 编码人员中的一个常见问题。一定有人知道这是什么?

4

1 回答 1

1

我发现您在成功登录后重定向的方式存在问题:这是一个 javascript 重定向,因此它只会在所有 php 完成执行并将结果发送到浏览器后才会发生。这意味着重定向后的代码也会被执行。

我建议直到最后才向浏览器输出任何内容并使用:

header("Location: /...");
exit();

在您想要重定向的任何地方组合,以便您确定在重定向代码之后您的会话不会发生任何事情。

为避免headers already sent出现问题,我还建议摆脱以下内容:

?>
<?php

就像第一行一样login.php

于 2012-07-12T01:19:44.153 回答