Подтвердить что ты не робот

Переменные сеанса PHP не сохраняются с помощью ajax

У меня есть сайт на одной странице, который использует AJAX для загрузки новых php файлов и обновления дисплея.

Я запускаю свой php-сеанс на главной странице, но когда я использую ajax для обновления внутреннего html, мне нужны эти переменные сеанса для загружаемого нового файла php.

Этот пост похож на этот: Переменные сеанса PHP не сохраняются. Но я проверил, и у моего php.ini есть session.use_cookies = 1

Главная страница PHP:

<?php 
session_start();
if(isset($_SESSION['views']))
{$_SESSION['views']=$_SESSION['views']+1;}
else
{$_SESSION['views']=1;}
?>

После ввода пользователем я использую ajax для вызова php файла и загрузки подраздела страницы:

<?php    
if(isset($_SESSION['views']))
    { echo "Views: " . $_SESSION['views'];} 
    else 
    { echo "Views: NOT SET";}
?>

Может кто-нибудь, пожалуйста, скажите мне, какой важный шаг мне не хватает? Спасибо.

Обновление:. После добавления вызова session_id() на главную и вспомогательную страницы я вижу, что обе страницы имеют один и тот же Session_ID. Однако он все еще не может вытащить переменную сеанса, и если я присвою ему значение, то переменные сеанса с двумя именами остаются независимыми друг от друга.

Отвечайте на вопрос, что этот вопрос создан: Я обнаружил, что мне пришлось установить статический путь session_save в моем файле php.ini. С большинством платных услуг веб-хостинга у них просто есть контейнер по умолчанию для сеансов, но на него влияет балансировка нагрузки. Какой релиз.

4b9b3361

Ответ 1

Я думаю, что вам не хватает session_start() на странице, которую вызывает Ajax.

Вам нужно:

<?php
session_start();
if(isset($_SESSION['views']))
    { echo "Views: " . $_SESSION['views'];} 
    else 
    { echo "Views: NOT SET";}
?>

Ответ 2

Вам нужно запустить сеанс session_start() в другом файле PHP, который вы вызываете через AJAX.

Ответ 3

В случае использования платной услуги веб-хостинга путь сохранения сеанса по умолчанию автоматически устанавливается следующим образом:

http://php.net/session.save-path
session.save_path = "/tmp/"

Вам нужно поместить статический путь в свою корневую папку.

Ответ 4

Я столкнулся с тем, что, как я думал, было той же проблемой при запуске PHP 7 на IIS Server 2012 сегодня.

Я добавил:

if(!isset($_SESSION)) 
{ 
    session_start(); 
} 

к началу каждого файла AJAX, но продолжал получать следующее уведомление PHP:

PHP Notice: A session had already been started - ignoring session_start()

Несколько поисков привели меня к этой теме, которая указала мне в правильном направлении решения проблем, с которыми я столкнулся. Надеемся, следующая информация поможет другим, столкнувшимся с одной и той же проблемой.

После проверки значения параметра session.save_path, в моем случае C:\Windows\Temp, я подумал, что лучше проверить разрешения папки, соответствующие разрешениям учетной записи пользователя, на которой я запускал IIS.

В моем случае оказалось, что каталог, который я назначил для хранения сессии (в php.ini), не имел того же пользователя (разрешения безопасности), назначенного ему, как тот, который запускал сайт IIS.

Интересно, что сеансы работали нормально, когда я не использовал AJAX-запросы до того, как я добавил новые пользовательские разрешения. Однако AJAX не подобрал сеанс, пока я не исправил проблему с разрешениями. Добавление той же учетной записи пользователя, в которой работает IIS, немедленно разрешило эту проблему.

Ответ 5

Необходимо инициализировать сеанс перед попыткой входа в систему через вызов ajax.

session_start();

Инициализируйте в верхней части страницы, откуда вы начинаете вход в систему ajax.

Так что SESSIONID будет создан и сохранен cookie браузера. И отправляется вместе с заголовком запроса во время вызова ajax, если вы выполняете запрос ajax в тот же домен

Для последовательных вызовов ajax браузер будет использовать SESSIONID, который был создан и сохранен первоначально в cookie браузера, если мы не очистим cookie браузера или не выйдем из системы (или не установим другой файл cookie)

Ответ 6

Вы пытаетесь использовать существующие данные сеанса из своего приложения в вызове ajax. Для этого измените способ вызова session_start следующим образом:

// With ajax calls
if (session_status()==1) {
    session_start(); 
}

При создании ajax-вызовов php-скриптов, которым нужны существующие данные сеанса, используйте session_start после session_status.

http://php.net/session_status