Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Странное поведение сессий
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Интересная штука у меня тут нарисовалась, пишу по порядку :
Есть сайт, на нем организовано голосование, вся схема состоит из трех файлов:
1. Скрипт, генерирующий страницу голосования
2. Скрипт генерирует Captcha-картинку
3. Скрипт принимает голоса
Соответственно все они связаны сессиями. В первом скрипте открывается сессия, куда заносится время открытия страницы. Первый скрипт отрабатывает и выдает страницу клиенту. В этой странице есть <img src="" ...>, ведущий на второй скрипт, генерирующий капчу. Значение на картинке, опять же, заносится в сессию. К третьему скрипту идёт обращение через ajax из первого скрипта. Тоесть через Геты туда передаётся Id, за который голосовать и значение капчи, введённое пользователем. Этот третий скрипт тоже открывает сессию, читает содержимое полей, заполненых первым и вторым скриптом и заносит в базу данных.
Теперь что не так :
Этот третий скрипт не видит значение сессии, заполненное в первом скрипте Тоесть переменная в персом скрипте не записывается в сессию. Самое интересное, что если первую страницу рефрешить после записи в сессию (стоит условие, что если есть переменная в сессии - выводим содержимое, если нет - создаем переменную и Header на самого себя) - то переменная в сессии появляется.
По моей логике все три скрипта работаю последовательно, пользователь не запрашивает капчу до момента, пока не загрузилась страница, на которой ссылка на эту капчу (а её он может увидеть только после отработки скрипта), проголосовать он так же может только после того, как сгенерирована и страница и капча ... (мухлежа точно не было, тестировал сам)
Гость
Отправлено: 04 Мая, 2009 - 10:19:49
УДАЛЁН
Stierus Проблема ваша конечно странная но ведь можно оставить и walkaround - как вы и говорите еслит переменных в сесси не было то первая страница рефрешит сама себя один разок и потом уже передается то что надо
Stierus
Отправлено: 04 Мая, 2009 - 10:22:43
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Да оставить можно что угодно, но хотелось бы знать, почему происходит такая странность
EuGen
Отправлено: 04 Мая, 2009 - 10:30:58
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Вот и посмотрите после первой загрузки, создаются ли на стороне клиента соответствующие куки. Что-то мне подсказывает, что нет
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Stierus
Отправлено: 04 Мая, 2009 - 10:41:58
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
очистил куки, пробую запустить скрипт с рефрешем. Первый раз куки не отправляются ( что естественно), устанавливаются, после рефреша ранее установленная кука уже идёт в скрипт.
EuGen
Отправлено: 04 Мая, 2009 - 10:45:12
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Ну вот, примерно то же самое будет, если сделать в скрипте:
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Гость
Отправлено: 04 Мая, 2009 - 10:49:42
УДАЛЁН
Stierus Вам всетаки придется делать указанный выше walkaround ИБО когда ваша страница создает cookie н не перезапускается она с помощью ajaxа вызывает другую страницу и та пытается читать cookie но браузер по какимто причинам не обновляет cookie установленные первой страницей и во вторую ничего не отправляется
Как вариант walkaroundа можно использовать document.cookie и там вручную поставить то что надо
Stierus
Отправлено: 04 Мая, 2009 - 10:50:20
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Так я и не запрашиваю куки в том же скрипте. Я их установил и забыл. а тоько в третем скрипте (обращение к которому через ajax) я смотрю на значение. Причём в куки идёт на значение, а сессионный id.
Тоесть мне непонятна ситуация. Раньше сессия в первом скрипте не открывалась, она первый раз открывалась во 2-м скрипте, генерирующем капча-код. Так вот там так же значение записывалось в сессию и все. Но 3-й скрипт прекрасно видел значение. тут мы добавили ещё 1 скрипт, работающий с той же сессией, предыдущие 2 все так же нормально записывают и читают, а этот ...
EuGen
Отправлено: 04 Мая, 2009 - 10:54:12
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Мне почему-то кажется, что это именно такой случай, так как, скорее всего, обращение к кукам пытается выполниться "с ходу". Возможно, я не прав, но я предположил, что это именно так. Сказать точно-то не могу, не видел, что именно там у Вас написано (то есть, по логике-то одно, а как реализовано - вопрос другой)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Stierus
Отправлено: 04 Мая, 2009 - 10:58:17
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Смотри :
было:
3 скрипта:
1. Скрипт выводит страницу
2. Первое обращение к сессии, запись значения кода капчи в сессию, вывод картинки
3. Чтение сессионной капчи, работа с бд
Все работало отлично
Стало:
3 скрипта:
1. Первое обращение к ессии, запись времени в сессию, вывод страницы
2. Второе обращение к сессии, запись значения кода капчи в сессию, вывод картинки
3. Чтение сессионныч капчи и времени, работа с бд
Сессионная капча видна, сессионное время не видно
Champion
Отправлено: 04 Мая, 2009 - 11:00:07
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
В первом скрипте открывается сессия, куда заносится время открытия страницы
А попробуй сделать 0ю страницу, которая отрабатывает перед 1й и стартуй сессию в ней. И из нее иди на 1ю страницу...
Где-то была у меня похожая штука, сейчас попытаюсь найти. Тоже скрипт, к которому обращение аяксом сессии не видел.
Stierus
Отправлено: 04 Мая, 2009 - 11:03:09
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
ну я вместо этой нулевой и сделал рефреш на самого себя Только мне непонятно, если проблема такая возникает, почему она не возникла раньше когда я сессию в капче первый раз стартовал и точно так же через ajax запрашивал третий скрипт ?
Гость
Отправлено: 04 Мая, 2009 - 11:18:45
УДАЛЁН
Stierus Вобщем еще раз повторюсь - как я уже писал ваша проблема состоит изза того что тот скрипт которуму нужна сессионная кука читает ее до момента как браузер ее РЕАЛЬНО установил посему вам в данной схеме не обойтись без такого рода walkaroundа
valenok
Отправлено: 04 Мая, 2009 - 17:50:54
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
А почему во втором случае он её реально устанавливает, а в первом нереально устанавливает ? Что-то мне подсказывает что тут без экспериментов с кодом не обойтись.
И так во всех браузерах, кстати ?
----- Truly yours, Sasha.
Гость
Отправлено: 04 Мая, 2009 - 19:32:44
УДАЛЁН
valenok Скорее всеге не во всех
Ведь проблемато вроде в том что браузер не устанавлмвает cookie РЕАЛЬНО и поэтому без перезагрузк страницы значения не выдаются
Как я уже и говорил можно вручную с помощью document.cookie менять
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.