Я не понимаю, что здесь происходит. У меня есть три страницы.
Каждая из этих страниц имеет следующий код вверху со своей собственной переменной 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, и вы можете видеть, что иногда все в порядке, а затем нет, что вы можете увидеть на последних двух щелчках.
Отметки времени включены.
Зачем Ajax когда-либо возвращал старую информацию?
Среда - Локальный веб-сервер в моей локальной сети, задержка отсутствует. - Наезд на веб-сервер по IP-адресу (без сумасшедшей маршрутизации DNS / прокси) - Bootstrap 3.3.7 - jQuery 3.1.1 - PHP 7.1
session_start();
вызывается на каждой такой странице. Причина, по которой это делается, заключается в том, что одновременная загрузка нескольких php-файлов с session_start();
в них вызывает предупреждение. Поскольку я пытаюсь быть хорошим программистом и делать это «правильно», я оборачиваю его таким образом, вместо того, чтобы использовать @session_start();
для подавления предупреждений, потому что это считается ленивым.
«Правильный способ» - создать один файл, содержащий логику запуска сеанса, и потребовать или включить его на страницы, которые в нем нуждаются.
На самом деле это действительно хорошая идея, и я думаю, что собираюсь это сделать ... однако я не уверен, что это изменит что-нибудь в моей проблеме здесь, поскольку мы абсолютно уверены, что $ _SESSION запускается правильно таким образом .
На моем сервере с 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';
Вам нужно вызвать session_start (), даже если сеанс уже установлен. Я бы не стал заморачиваться с session_status ()