Переменные сеанса 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. С большинством платных услуг веб-хостинга у них просто есть контейнер по умолчанию для сеансов, но на него влияет балансировка нагрузки. Какой релиз.

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

Тебе нужно:

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

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

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

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

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

Я столкнулся с тем, что, как я думал, было той же проблемой при запуске 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, немедленно разрешило эту проблему.

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

 session_start(); 

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

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

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

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

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

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

http://php.net/session_status