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
Форумы портала PHP.SU :: Версия для печати :: Странное поведение сессий
Форумы портала PHP.SU » PHP » Программирование на PHP » Странное поведение сессий

Страниц (2): [1] 2 »
 

1. Stierus - 04 Мая, 2009 - 09:31:08 - перейти к сообщению
Интересная штука у меня тут нарисовалась, пишу по порядку :

Есть сайт, на нем организовано голосование, вся схема состоит из трех файлов:
1. Скрипт, генерирующий страницу голосования
2. Скрипт генерирует Captcha-картинку
3. Скрипт принимает голоса

Соответственно все они связаны сессиями. В первом скрипте открывается сессия, куда заносится время открытия страницы. Первый скрипт отрабатывает и выдает страницу клиенту. В этой странице есть <img src="" ...>, ведущий на второй скрипт, генерирующий капчу. Значение на картинке, опять же, заносится в сессию. К третьему скрипту идёт обращение через ajax из первого скрипта. Тоесть через Геты туда передаётся Id, за который голосовать и значение капчи, введённое пользователем. Этот третий скрипт тоже открывает сессию, читает содержимое полей, заполненых первым и вторым скриптом и заносит в базу данных.

Теперь что не так :
Этот третий скрипт не видит значение сессии, заполненное в первом скрипте Улыбка Тоесть переменная в персом скрипте не записывается в сессию. Самое интересное, что если первую страницу рефрешить после записи в сессию (стоит условие, что если есть переменная в сессии - выводим содержимое, если нет - создаем переменную и Header на самого себя) - то переменная в сессии появляется.

По моей логике все три скрипта работаю последовательно, пользователь не запрашивает капчу до момента, пока не загрузилась страница, на которой ссылка на эту капчу (а её он может увидеть только после отработки скрипта), проголосовать он так же может только после того, как сгенерирована и страница и капча ... (мухлежа точно не было, тестировал сам)
2. Гость - 04 Мая, 2009 - 10:19:49 - перейти к сообщению
Stierus Проблема ваша конечно странная но ведь можно оставить и walkaround - как вы и говорите еслит переменных в сесси не было то первая страница рефрешит сама себя один разок и потом уже передается то что надо
3. Stierus - 04 Мая, 2009 - 10:22:43 - перейти к сообщению
Да оставить можно что угодно, но хотелось бы знать, почему происходит такая странность Улыбка
4. EuGen - 04 Мая, 2009 - 10:30:58 - перейти к сообщению
Вот и посмотрите после первой загрузки, создаются ли на стороне клиента соответствующие куки. Что-то мне подсказывает, что нет
5. Stierus - 04 Мая, 2009 - 10:41:58 - перейти к сообщению
очистил куки, пробую запустить скрипт с рефрешем. Первый раз куки не отправляются ( что естественно), устанавливаются, после рефреша ранее установленная кука уже идёт в скрипт.
6. EuGen - 04 Мая, 2009 - 10:45:12 - перейти к сообщению
Ну вот, примерно то же самое будет, если сделать в скрипте:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. setcookie("TestCookie", $value);
  4. print_r($_COOKIES);//тут - пусто
  5. ?>
  6.  
7. Гость - 04 Мая, 2009 - 10:49:42 - перейти к сообщению
Stierus Вам всетаки придется делать указанный выше walkaround ИБО когда ваша страница создает cookie н не перезапускается она с помощью ajaxа вызывает другую страницу и та пытается читать cookie но браузер по какимто причинам не обновляет cookie установленные первой страницей и во вторую ничего не отправляется
Как вариант walkaroundа можно использовать document.cookie и там вручную поставить то что надо
8. Stierus - 04 Мая, 2009 - 10:50:20 - перейти к сообщению
Так я и не запрашиваю куки в том же скрипте. Я их установил и забыл. а тоько в третем скрипте (обращение к которому через ajax) я смотрю на значение. Причём в куки идёт на значение, а сессионный id.

Тоесть мне непонятна ситуация. Раньше сессия в первом скрипте не открывалась, она первый раз открывалась во 2-м скрипте, генерирующем капча-код. Так вот там так же значение записывалось в сессию и все. Но 3-й скрипт прекрасно видел значение. тут мы добавили ещё 1 скрипт, работающий с той же сессией, предыдущие 2 все так же нормально записывают и читают, а этот ...
9. EuGen - 04 Мая, 2009 - 10:54:12 - перейти к сообщению
Мне почему-то кажется, что это именно такой случай, так как, скорее всего, обращение к кукам пытается выполниться "с ходу". Возможно, я не прав, но я предположил, что это именно так. Сказать точно-то не могу, не видел, что именно там у Вас написано (то есть, по логике-то одно, а как реализовано - вопрос другой)
10. Stierus - 04 Мая, 2009 - 10:58:17 - перейти к сообщению
Смотри :

было:

3 скрипта:
1. Скрипт выводит страницу
2. Первое обращение к сессии, запись значения кода капчи в сессию, вывод картинки
3. Чтение сессионной капчи, работа с бд

Все работало отлично

Стало:

3 скрипта:
1. Первое обращение к ессии, запись времени в сессию, вывод страницы
2. Второе обращение к сессии, запись значения кода капчи в сессию, вывод картинки
3. Чтение сессионныч капчи и времени, работа с бд

Сессионная капча видна, сессионное время не видно
11. Champion - 04 Мая, 2009 - 11:00:07 - перейти к сообщению
Stierus пишет:
1. Скрипт, генерирующий страницу голосования
2. Скрипт генерирует Captcha-картинку
3. Скрипт принимает голоса
Stierus пишет:
В первом скрипте открывается сессия, куда заносится время открытия страницы
А попробуй сделать 0ю страницу, которая отрабатывает перед 1й и стартуй сессию в ней. И из нее иди на 1ю страницу...
Где-то была у меня похожая штука, сейчас попытаюсь найти. Тоже скрипт, к которому обращение аяксом сессии не видел.
12. Stierus - 04 Мая, 2009 - 11:03:09 - перейти к сообщению
ну я вместо этой нулевой и сделал рефреш на самого себя Улыбка Только мне непонятно, если проблема такая возникает, почему она не возникла раньше когда я сессию в капче первый раз стартовал и точно так же через ajax запрашивал третий скрипт ?
13. Гость - 04 Мая, 2009 - 11:18:45 - перейти к сообщению
Stierus Вобщем еще раз повторюсь - как я уже писал ваша проблема состоит изза того что тот скрипт которуму нужна сессионная кука читает ее до момента как браузер ее РЕАЛЬНО установил посему вам в данной схеме не обойтись без такого рода walkaroundа Улыбка
14. valenok - 04 Мая, 2009 - 17:50:54 - перейти к сообщению
А почему во втором случае он её реально устанавливает, а в первом нереально устанавливает ? Что-то мне подсказывает что тут без экспериментов с кодом не обойтись.
И так во всех браузерах, кстати ?
15. Гость - 04 Мая, 2009 - 19:32:44 - перейти к сообщению
valenok Скорее всеге не во всех
Ведь проблемато вроде в том что браузер не устанавлмвает cookie РЕАЛЬНО и поэтому без перезагрузк страницы значения не выдаются
Как я уже и говорил можно вручную с помощью document.cookie менять

 

Powered by ExBB FM 1.0 RC1