|
Страница 1 из 1 [ Сообщений: 14 ] |
Автор |
Сообщение |
Konyukhov
новый человек
|
|
Столкнулся с такой задачей.
Имеется: движок сайта, работающий как на ajax, так и без оного
Требуется: при загрузке сайта определить, включен ли JS, и установить сессионную переменную в PHP.
Я пробую сделать следующим образом: перед загрузкой основной логики посылаю ajax запрос, и устанавливаю на сервере сессионную переменную, например, $_SESSION['ajax'] = true
Но это работать не хочет, ибо в дальнейнем PHP-коде эту переменную не видно. Я не совсем хорошо разбираюсь в механизме сессий в случае использования асинхронных запросов и не могу точно сформулировать почему это не работает, но понимаю, что вроде как и не должно работать...
Какие будут идеи? Всякими редиректами заморачиваться не хочу.
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
|
|
|
AlexShop
участник
|
|
Сессия должна работать. Если разные домены (субдомены) - тогда сессия не будет работать.
Я бы проверил: не меняется ли значение session_id().
Запросы на сервер можно посылать не только XMLHttpRequest, но и скрытым IFRAME или IMG (в одну сторону).
_________________ Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
|
|
|
|
|
Konyukhov
новый человек
|
|
AlexShop, выражусь поточнее.
Из index.php запускается javascript, который отправляет ajax-запрос, в котором, в свою очередь, обрабатывающий PHP-скрипт устанавливает сессионную переменную. В JS приходит ответ. Если он приходит, значит, JS работает. Далее в index.php я смотрю значение той сессионной переменной. Изменений нет! Т.е. ее не видно. Я подозреваю, что не видно ее потому, что PHP-скрипт не видит сессионные переменные, которые установлены в подзапросе ajax.
id сейчас проверю... проверил. Одинаковый.
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
|
|
|
AlexShop
участник
|
|
Konyukhov,
Если я правильно понимаю, то:
index.php исполнился до того когда Ajax послал запрос и установил сессию. Поэтому сессии в index.php не должно быть.
_________________ Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
|
|
|
|
|
Konyukhov
новый человек
|
|
AlexShop, я попробовал сделать следующим образом:
- до посыла запроса ajax я не делаю session_start() (но делал этот ранее)
- в подзапросе ajax я стартую сессию;
- дальше, в index.php я стартую сессию и вижу в ней установленную переменную.
Вроде все заработало.
Таким образом, выбранная мною схема не работала потому, что сначала сессия инициализировалась в index.php, до выполнения подзапроса; затем я "открывал" уже проинициализированную сессию в подзапросе и устанавливал в ней переменную, но PHP-код в index.php не видел переменную, установленную в подзапросе, так как механизм сессий, видимо, не перечитывает данные, а видит только те, которые установлены непосредственно в ходе выполнения скрипта.
Несколько сумбурно, но смысл, наверное, понятен.
Примененный механизм не универсален - он не позволяет передавать значения в уже открытую сессию.
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
|
|
|
Konyukhov
новый человек
|
|
Я прогнал. Это не работает.
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
|
|
|
Konyukhov
новый человек
|
|
Короче, резюмирую: во время выполнения PHP-скрипта (внутри скрипта, без перегрузок) определить, включен ли JS, нельзя.
Сессионный механизм таков, что переменные, установленные в подзапросах, не видны в основном скрипте, пока он выполняется.
Куки можно отключить (была идея устанавливать куки в подзапросе, а в основном скрипте ждать, пока не появится нужна кука, т.к. ajax-запрос выполняется не моментально).
Сохранять файл на сервере и потом ждать его появления... вариант, но не хочу. Может, сделаю, но пока поищу что-то более другое.
Вопрос остается открытым.
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
|
|
|
Crazy
Модератор
|
|
Konyukhov писал(а): | Короче, резюмирую |
Это не было очевидно априори? Цитата: | в основном скрипте ждать, пока не появится нужна кука |
...вижу, что и сейчас не очевидно. Я тебя огорчу: ты в принципе неверно понимаешь, как работает PHP. Ждать появления куки в уже запущенном скрипте ты будешь до морковкиного заговенья.
Итак: книжки в руки -- и читать, читать, читать.
|
|
|
|
|
AlexShop
участник
|
|
Konyukhov писал(а): | Сессионный механизм таков, что переменные, установленные в подзапросах, не видны в основном скрипте, пока он выполняется. |
Это не сессионный механизм таков, ты желаешь того чего не должен хотеть.
Задача (правильно сформулированная) решается многими способами.
_________________ Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
|
|
|
|
|
Konyukhov
новый человек
|
|
Crazy, AlexShop, да, признаюсь, некоторые аспекты работы PHP я представлял неверно и поверхностно.
Пока что остается вернуться к идее сохранения специального файла через xmlHTTPRequest и ожидании его появления.
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
|
|
|
AlexShop
участник
|
|
Konyukhov писал(а): | Пока что остается вернуться к идее сохранения специального файла через xmlHTTPRequest и ожидании его появления. |
А этот файл, на сервере, будут читать все пользователи (у которых JS включен и отключен)?
_________________ Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
|
|
|
|
|
Konyukhov
новый человек
|
|
Сделал следующим образом:
в index.php стартую сессию; если определенная сессионная переменная false, запускаю ajax-запрос, который устанавливает сессионную переменную, и по завершению запроса делаю location.reload().
Все "идеи" сохранять что-либо на сервере провалились по одной простой причине: если не работает js, то ничего и не изменится, и ждать изменений, действительно, можно долго, равно как и невозможно определить то состояние, когда ничего не случилось.
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
|
|
|
AlexShop
участник
|
|
Konyukhov писал(а): | по завершению запроса делаю location.reload(). |
Вот теперь должно работать. Потому что PHP файл за один раз никогда не узнает что творится с настройками броузера. Ему нужно об этом сообщить, вызвав его второй раз.
_________________ Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
|
|
|
|
|
|
Страница 1 из 1 [ Сообщений: 14 ] |
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
|
|