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

标签 javascript php jquery ajax session

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

  • 主页.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 发送一个 post 并将结果记录到控制台。

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();

调用

当我在页面之间单击时,我希望看到这两个同步,但是当我在导航之间单击时将 session 记录到控制台时,它们不匹配,ajax 调用通常滞后一次单击页面我实际上在。因此,例如,我将从“Home.php”转到“Reports.php”,我会得到一个空值(好像 $_SESSION 尚未设置)或者我会得到 { thispage: "Home"很明显,我刚刚导航到 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 单击时自动应用样式,它只是添加和删除具有某些样式的“事件”类。我正在调用我的 session 。

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 上
  • 计数 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

最佳答案

在我的服务器上,对于 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';

关于javascript - Ajax $_POST 调用 PHP $_SESSION 返回过期信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50126811/

相关文章:

javascript - 在 Bootstrap 和 AngularJS 中使用 ng-repeat 的结构问题

javascript - 需要一个类似于 jekyll 的客户端 javascript 静态网站生成器 - 没有服务器端任何东西

php - mySQL(和 php)中的特殊字符 - 基础知识

javascript - Kendo UI Web - MultiSelect : select an option more than once

javascript - 动态添加选项到select2

javascript - 将文件上传到我的本地 apache 服务器

javascript - 使用 jQuery 获取标签内部的值。?

php - 如何在mysql,php中访问每个类别中相等数量的行

PHP/MySQL 仅在变量少于几个字符时更新

javascript - 如何制作一个JSON对象?