对PHP $ _SESSION的Ajax $ _POST调用返回过时信息

时间:2018-05-02 03:41:14

标签: javascript php jquery ajax session

我不明白这里发生了什么。我有三页。

  • Home.php
  • Nearmiss.php
  • Reports.php

这些页面中的每一个都在顶部有以下代码,并带有自己的" thispage"特定于该页面的变量。

<?php
    // home.php
    if ( session_status() == PHP_SESSION_NONE ) {
      session_start();
    }
    $_SESSION['thispage'] = 'Home';
    echo('<div id="thispage" hidden>' . $_SESSION['thispage'] . '</div>')
?>

当我打开每个页面并检查源代码时,我确切地看到了我应该看到的内容,隐藏的div包含正确的页面名称。但是我的应用程序内部有一个函数,我试图用它来监视javascript中的$ _SESSION以进行测试。我正在对logsession.php进行ajax调用(见下文)。

<?php
    // logsession.php
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        if ( session_status() == PHP_SESSION_NONE ) {
          session_start();
        }
        echo( json_encode( $_SESSION ) );
    }
?>

我的javascript函数是这样写的,它只是发一个帖子到logsession.php并将结果记录到控制台。

let app = (function() {
    var session = function() {
        $.ajax({
            type: "post",
            url: "includes/logsession.php",
            dataType: "json"
        }).then( function( data ) {
            console.log( data );
        });
    }
    return {
        session : session
    }
}());

可以使用app.session();

在控制台调用

我希望看到其中的两个同步,因为我在页面之间点击,但当我将会话记录到控制台时,我点击我的导航它们不匹配,ajax调用经常滞后于页面后面的一次点击I& #39;实际上是。例如,我将来自&#34; Home.php&#34;到&#34; Reports.php&#34;我会得到一个空值(好像$ _SESSION还没有设置)或者我得到{thispage:&#34; Home&#34;很明显我刚刚导航到Reports.php。

我的导航是通过bootstrap完成的。

<!-- Navbar Left -->
<div id="navbar" class="navbar-collapse collapse">
   <ul class="nav navbar-nav">
      <li id="lnkHome"><a href="#">Home</a></li>
      <li id="lnkNearmiss"><a href="#">Nearmiss</a></li>
      <li id="lnkReports"><a href="#">Reports</a></li>
   </ul>
</div>

我的导航栏已设置好,以便在刷新功能中使用某些javascript点击时自动应用样式,这只会添加和删除&#34;活动&#34;有一些风格的类。在这个我打电话给我的会议。

let refresh = (function() {
    var navbar = function( element ) {
        $('#navbar ul li').removeClass('active');
        $(element).addClass('active');
        app.session();
    }
return {
        navbar : navbar
    }
}());

将我的refresh.navbar();函数链接连接起来的点击事件如下所示。

$(document).on('click', '#lnkHome', function() {
    if ( $('#thispage').html() != 'Home' ) {
        // note, references the content of the hidden divs
        refresh.navbar( this );
    }
});

当我点击我的链接时,这就是我所看到的。从Home.php开始,我每隔几秒钟顺序点击一次到Nearmiss.php,然后点击Reports.php,你可以看到它有时很好,然后不是,你可以在最后两次点击中看到它。

  • 计数20实际上是在Nearmiss.php
  • Count 21实际上是Reports.php

包括时间戳。

Google Chrome console showing app.session(); log

为什么Ajax会返回旧信息?

环境   - 我的LAN上的本地Web服务器,延迟不存在。   - 通过IP地址访问Web服务器(没有dns /代理疯狂路由)   - Bootstrap 3.3.7   - jQuery 3.1.1   - PHP 7.1

1 个答案:

答案 0 :(得分:1)

在我的服务器上,使用PHP 7+, session_status()始终返回 PHP_SESSION_NONE

<?php
if ( session_status() === PHP_SESSION_NONE ) {
        session_start();
        echo 'Session started<br>';
}
echo 'Session established';
$_SESSION['this'] = 'that';

看起来你正在尝试建立一个页面点击计数器。我就是这样做的:

<强> session.php文件

session_start();
$page = basename($_SERVER['REQUEST_URI'],'.php');
// Check if there is a session variable for this page
// If there isn't one, initialize one to zero
if (!isset($_SESSION[$page])) {
        $_SESSION[$page] = 0;
}
$_SESSION[$page]++;
var_dump($_SESSION);  // Debug only

<强>一些-page.php文件

require_once 'session.php';