Вызов Ajax $ _POST для PHP $ _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 содержит правильное имя страницы. Однако в моем приложении есть функция, которую я пытаюсь использовать для отслеживания $ _SESSION в javascript в целях тестирования. Я выполняю 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.info( 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
  • Граф 21 был на самом деле на Reports.php

Отметки времени включены.

Вызов Ajax $ _POST для PHP $ _SESSION возвращает устаревшую информацию

Зачем Ajax когда-либо возвращал старую информацию?

Среда - Локальный веб-сервер в моей локальной сети, задержка отсутствует. - Наезд на веб-сервер по IP-адресу (без сумасшедшей маршрутизации DNS / прокси) - Bootstrap 3.3.7 - jQuery 3.1.1 - PHP 7.1

Вам нужно вызвать session_start (), даже если сеанс уже установлен. Я бы не стал заморачиваться с session_status ()

user2182349 02.05.2018 05:45
session_start(); вызывается на каждой такой странице. Причина, по которой это делается, заключается в том, что одновременная загрузка нескольких php-файлов с session_start(); в них вызывает предупреждение. Поскольку я пытаюсь быть хорошим программистом и делать это «правильно», я оборачиваю его таким образом, вместо того, чтобы использовать @session_start(); для подавления предупреждений, потому что это считается ленивым.
Lucretius 02.05.2018 05:48

«Правильный способ» - создать один файл, содержащий логику запуска сеанса, и потребовать или включить его на страницы, которые в нем нуждаются.

user2182349 02.05.2018 05:53

На самом деле это действительно хорошая идея, и я думаю, что собираюсь это сделать ... однако я не уверен, что это изменит что-нибудь в моей проблеме здесь, поскольку мы абсолютно уверены, что $ _SESSION запускается правильно таким образом .

Lucretius 02.05.2018 06:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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';

Другие вопросы по теме