Ответ 1
Я думаю, что вам не хватает session_start()
на странице, которую вызывает Ajax.
Вам нужно:
<?php
session_start();
if(isset($_SESSION['views']))
{ echo "Views: " . $_SESSION['views'];}
else
{ echo "Views: NOT SET";}
?>
У меня есть сайт на одной странице, который использует 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_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.