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


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以进行测试。我正在对ajax调用logsession.php(如下)。

<?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调用通常落后于我实际上在页面后面的一键上。因此,例如,我将从“ Home.php”转到“ Reports.php”,并且将得到一个空值(好像尚未设置$ _SESSION),或者我将得到{thispage:“ Home”显然,我只是浏览到Reports.php。

我的导航是使用引导程序完成的。

<!-- 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单击时会自动应用样式,该功能只会添加和删除带有某些样式的“活动”类。在此,我正在打电话给我的会议。

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上


包含时间戳记。

javascript - 对PHP $ _SESSION的Ajax $ _POST调用返回过期信息-LMLPHP

为什么Ajax会返回旧信息?

环境
 -我的局域网上的本地Web服务器,不存在延迟。
 -通过IP地址命中Web服务器(无dns /代理疯狂路由)
 -Bootstrap 3.3.7
 -jQuery 3.1.1
 -PHP 7.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


some-page.php

require_once 'session.php';

09-19 07:48