【问题标题】:PHP Session not carrying over to protected pagesPHP Session 没有转移到受保护的页面
【发布时间】:2014-07-01 21:42:29
【问题描述】:

我在尝试为我的 Web 应用程序实现登录系统时遇到了非常困难的时间。

就我的 index.php 而言,我的基本逻辑正常工作 - 如果用户尝试在那里导航并且没有登录,它会将他们重定向到登录屏幕。一旦他们提供了正确的凭据,他们就会被正确地引导回受保护的 index.php 页面。

代码中的这个逻辑可以在这里看到:

(index.php)

    <?php
    session_start();
    include_once 'db_functions.php';
    require_once 'access.php';

    if (!userIsLoggedIn()) {
        include 'login.php';
        exit();
    }

当用户尝试导航到另一个受保护的页面时会出现此问题。我的逻辑是让受保护的页面检查用户是否已登录,如果未登录,则将它们发送回索引,然后将它们发送到登录屏幕。

(protectedpage.php)

   <?php
    session_start();
    require_once 'access.php';
    echo "Logged in: " + $_SESSION['loggedIn'];
    echo "User: " + $_SESSION['email'];
    echo "Password: " + $_SESSION['password'];
    // receive data from HTML readcalllog request

    $rName=$_POST["registration"]; //irrelevant post data
    $rowId=$_POST["rowid"]; //irrelevant post data

    if ($_SESSION['loggedIn'] == FALSE) {
        header('Location: http://www.myapp.com/index.php'); //if not logged in, return to index.php, which in turn redirects to a logon page. 
        exit();
    }

如您所见,我包含了测试回显语句以打印出当前会话的详细信息。当我导航到页面(关闭重定向功能)以检查错误消息时,它将打印"000",而前面没有"Logged in: ""User: " 文本。

我执行了一个测试并在 index.php 页面上成功打印了详细信息,因此由于某种原因,当我从 index.php 导航到另一个受保护的页面时会话丢失了。

任何帮助将不胜感激!

编辑: 这是access.php 函数中 userIsLoggedIn() 的一部分,用于设置会话变量:

function userIsLoggedIn()
{
    if (databaseContainsAuthor($_POST['email'], $password))
    {
      session_start();
      $_SESSION['loggedIn'] = TRUE;
      $_SESSION['email'] = $_POST['email'];
      $_SESSION['password'] = $password;
      return TRUE;
    }
    else
    {
      session_start();
      unset($_SESSION['loggedIn']);
      unset($_SESSION['email']);
      unset($_SESSION['password']);
      $GLOBALS['loginError'] =
          'The specified email address or password was incorrect.';
      return FALSE;
    }
  }
}

编辑 2: 如果我登录到索引页面,转到受保护的页面(这会将我发送到登录屏幕)并再次登录,会话正常运行并且所有受保护的页面都可以访问。 我只需要弄清楚是什么阻止了初始登录创建一个正确的会话。

【问题讨论】:

  • 您的登录信息如何
  • 我看到的两个文件之间的唯一区别是include_once 'db_functions.php';:您确定db_functions.php 中没有什么重要的内容,还是您也尝试将其包含在protectedpage.php 中?
  • 这些不是完整的文件,只是适用于会话和登录的部分的 sn-ps。
  • 你也应该在受保护的页面中使用userIsLoggedIn,而不是$_SESSION['loggedIn'] === FALSE tho
  • 一个请求不要多次使用 session_start。把它放在第一行。不在您的登录功能中。否则会产生通知

标签: php session


【解决方案1】:

首先,您不需要在一个页面中多次包含session_start();。只需将其插入每个文件的开头即可。

如果我是你,我会使用这个语句来查看用户是否在受保护的页面中登录:

    if ( !isset($_SESSION['email'] && !isset($_SESSION['password'] ) ) {
        header('Location: http://www.myapp.com/index.php'); //if not logged in, return to index.php, which in turn redirects to a logon page. 
        exit();
    } else {
        echo "Logged in";
    }

另外,我建议您同时使用$_SESSION$_COOKIES 来创建更强大的登录系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2010-09-17
    • 1970-01-01
    • 2021-06-10
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多