У меня есть сайт на одной странице, который использует 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.