【问题标题】:PHP session is coming back nullPHP会话返回null
【发布时间】:2015-10-11 00:51:41
【问题描述】:

我正在尝试提出会话超时(第一次)。每当我调用 if 语句时,它都会为 $_SESSION 变量获取空值。我在顶部的 header.php 文件中开始了会话。当用户登录时,它会使用以下代码创建会话:

public static function create_session($values) {
    foreach ( $values as $key => $value ) {
        if ($key != "password") {
            $_SESSION[$key] = $value;
        }           
    }

    $_SESSION["timestamp"] = time();
}

然后它会重定向到一个仅包含以下内容的索引页面:

<?php
  echo "<pre>";
  print_r($_SESSION);
  echo "</pre>";
?>

这行得通,它可以很好地打印页面上的所有会话变量。

这就是上面代码在 index.php 文件中打印出来的内容。

Array
(
  [id] => 33
  [first_name] => removed to not show name
  [last_name] => removed to not show name
  [email] => test@test.com
  [timestamp] => 1437486426
)

在我的 footer.php 文件中,我有一些 jquery 每 5 秒运行一次定时函数,调用 timeout.php 文件。

(function poll() {
   setTimeout(function() {
       $.ajax({ url: "timeout.php", success: function(data) {
            console.log(data);
       }, dataType: "json", complete: poll });
    }, 5000);
})();

超时的php文件里面只有这段代码:

if (isset($_SESSION)) {
    if ($_SESSION['timestamp'] + 10 * 60 < time()) {
        // session timed out
        echo json_encode(array('session' => $_SESSION, 'session_timestamp' => $_SESSION['timestamp'], 'timestamp_calculation' => $_SESSION['timestamp'] + 10 * 60, 'timeoutstatus' => 'timed out'));
    } else {
        // session ok
        echo json_encode(array('session' => $_SESSION, 'session_timestamp' => $_SESSION['timestamp'], 'timestamp_calculation' => $_SESSION['timestamp'] + 10 * 60, 'timeoutstatus' => 'not timed out'));
    }
} else {
    echo json_encode(array('session' => 'Session does not exits'));
}

由于某种原因,我得到的会话不存在。如果我删除了 if 语句的那部分并只测试超时,所有调用 $_SESSION 的 json 数组变量都返回 null。我不知道为什么会这样。感谢您的帮助。

作为对这是重复的回应。最初的想法是 session_start() 没有被调用。我已经提到它在第一段中被调用,它出现在所有其他 php 代码之前。我还确认我可以在索引页中调用 $_SESSION 变量就好了。我只是在尝试通过从 footer.php 调用的 ajax 函数读取它时遇到问题。

【问题讨论】:

  • 我在任何地方都看不到session_start()。我看不出你的索引页是如何像你说的那样工作的。
  • 您开始会话了吗? session_start(); php.net/session_start
  • session_start() 函数位于 header.php 文件中,因此无论如何都会调用它。我没有将其包含在此处的代码中。所以层次结构将 header.php 与 session_start() -> index.php -> footer.php

标签: php jquery ajax session


【解决方案1】:

您尚未在 timeout.php 文件中启动会话和/或未将您的 header.php 包含在此文件中,因此 会话 将永远不会在 timeout.php 中启动。那就是 timeout.php 文件中未定义的会话。

您可以在timeout.php 中添加条件,例如:

if(!isset($_SESSION)) session_start();

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 2016-09-23
    • 2019-06-08
    • 2017-07-03
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多