Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Sessions & Cookies


Автор: SneG0K 15.3.2008, 04:00
Доброго времени суток. Не работают куки и не регистрируется сессия. smile 
Есть следующий алгоритм: Пользователь зашел на сайт->Идентифицировался->Словил куку->И все
Делаю так. Выбираю записи из БД, переадресовываю инфу другому скрипту с идентификатором сессии, а он должен установить куку,а кука просто не устанавливается. Вот код скрипта 
Код

<?php
session_start();
$session=$_GET['sid'];
$think=$_GET['think'];
switch($think)
 {
  case 0:
   {
    setcookie("user",$session,0);
    session_register('user');
    $_SESSION['user']=admin;
    echo "<script>location.href='../index.php'; </script>";
    break;
   }
  case 1:
   {
    setcookie("user",$session,time()+2419200);
    echo "<script>location.href='../index.php'; </script>";
    break;
   }
  default:
   {
    echo "Don't find this module";
    break;
   }
 }
session_destroy();
?>

В итоге сессия не регестрируется, кука не устанавливается smile  smile  smile 
Что я не так делаю??? 

Автор: ksnk 15.3.2008, 10:09
Может, еще раз почитать документацию?
Сессия для скрипта, который обрабатывается PHP - это идентификатор, по которому строится имя сессионного файла. Этот идентификатор находится в куке, если есть возможность, или в адресной строке, если куки отключены. Кука или параметр адресной строки по умолчанию называются PHPSESSID.

Добавлено через 7 минут и 28 секунд
session_destroy();
вот про это следует почитать в документации ;-)

Автор: Feldmarschall 15.3.2008, 10:20
Ну и каша...

Во первых, 
Цитата(SneG0K @  15.3.2008,  04:00 Найти цитируемый пост)
 Не работают куки и не регистрируется сессия.  Есть следующий алгоритм:

Это заявление логически необосновано. Чтобы говорить, что не работают куки, надо писать код, который проверяет, работают ли куки.
И дело не в том, что ты говоришь. А в том, как ты воспринимаешь ситуацию.
Gрограммист тем и отличается от юзера, что основывается в своих выводах на фактах - иначе ему просто никогда не найти ошибку.
Gоэтому программист всегда проверяет свои утверждения.
Думаем, что не работают куки - проверяем работу кук, скриптом
Код

setcookie("user","test",0);
echo $_COOKIE["test"];

Если не работают - разбираемся. Только с куками, и ничем больше. 
Если работают - ищем проблему дальше.

Думаем, что не работают сессии? Проверяем, тестовым скриптом, например, отсюда: http://phpfaq.ru/sessions
Если не работают - разбираемся. Только с сессиями, и ничем больше. 
Если работают - ищем проблему дальше.

Дальше - значит, что проблема не в куках и не в сессиях, а в алгоритме.
Алгоритм надо ОТЛАЖИВАТЬ. Слово написано большими буквами потому, что это главное слово в программировании.
Отладка - это многоуровневое пошаговое выполнение. Разделяем задачу на не свзанные между собой сегменты (шаги), и каждый выполняем построчно (по шагам). На каждом шаге проверяя корректность данных.

Мы уже начали отлаживать, проверяя сегменты по работе с куками и сессиями.
Теперь проверяем пошагово основной текст.
К примеру, что у тебя находится в переменной $session?
Какое значение выставляет куке оператор setcookie("user",$session,0);?
А эта ветка case вообще выполняется?
Не знаешь. А надо знать.

Вот в этом и заключается работа программиста. Не switch - case писать. А знать, какое значение имеет каждая переменная в каждый момент выполнения программы. Не все время знать, конечно. А тогда, когда он занимается отладкой.
И руководствоваться логикой.
То есть, описание ситуации не на уровне "я поставил куку, а она не работает", а "я выставил куку с такими-то параметрами".
Все, ВСЕ свои действия надо проверять! Буквально каждую строчку.

Но самое смешное во всей этой ситуации - что отлаживать, проверять свои переменные программист может только сам, на своей машине. На форуме за него это при всем желании не сделают. поэтому придется учиться искать ошибки самостоятельно.

И убери из кода ненужную session_register и совсем уж чудовищную session_destroy

Автор: SneG0K 15.3.2008, 18:10
Так, обьясню по подробней. Скрипту передается два параметра (sid и think). В параметре sid передается идентефикатор сессии, а в параметре think передается числовое значение, если оно равно 0, то кука должна установится лиш на один сеанс с броузером, а если оно равно 1, то кука устанавливается на месяц. Вот для этого у меня и есть switch..case.

Теперь дальше, сказав, что кука не создается, я тестировал этот код на "ослике" (Internet Explorer). Заходил в папку \Documents and Settings\*****\cookies , но там вообще пусто. Кука не создалась, аналогично она и не считывается $_COOKIE['user']. 

Так же и с сессиями. Файл сессии во временном каталоге сервера создается, но он абсолютно пустой. и сессия не считывается. точнее возвращает пустое значение. 

Так, что я все проверил и перепроверил. Может у меня в настройках php.ini что-то не так. Хотя я не знаю. 

Автор: Feldmarschall 15.3.2008, 18:45
Ты, видимо, не очень внимательно читал то, что тебе пишут.
Цитата(SneG0K @  15.3.2008,  18:10 Найти цитируемый пост)
Может у меня в настройках php.ini что-то не так

Да. Не то что невнимательно - ты вообще не читал.
повторяю ещё раз. Может в настройках php.ini что-то не так. Может. Но чтобы что-то исправлять в настройках, надо сначала понять, что именно не работает. Какую конкретно настройку исправлять.
Чтобы узнать, что конкретно не работает, надо проверить работу своего кода.
А тв проверил только на словах. А на деле, ни на один из вопросов, которые я задал (а, на самом деле, ты должен был задать сам себе) ты не ответил.

Повторяю вопросы:
1. Проверил ли ты, работают ли куки вообще, с помощью обновления страницы с кодом
Код
<?
setcookie("user","test",0);
echo $_COOKIE["test"];
?>


2. Что у тебя находится в переменной $session?

3. Выполняется ли вообще ветка с установкой куки?

Доложи, пожалуйста, по пунктам.
И не бодрым рапортом "Все проверил!", не сделав при этом вообще ничего. Помни - ты это делаешь не для меня. А для себя.
Поэтому реально выполни все, что написано, и четко опиши - как именно проверял ,и что в результате получил.



Автор: SneG0K 16.3.2008, 03:28
Итак докладываю:

1)Пробовал устанавливать куку, через твой скрипт. заходил через оперу, ослика. Везде результат глух!!! В ослике даже файл куки не создается smile 

2)Пробую зарегестрировать сессию так:

Код

<?php
session_start();
session_register('user');
$_SESSION['user']='user';
echo $_SESSION['user'];
session_destroy();
?>
 Опять ничего! Просто пусто! я даже не знаю где искать ошибку smile Хотя в принципе в сессиях я мог где-то и ошибится. У меня в книжке не силоно много света проливается на это. Так, что если можно посоветуйте иль дайте линк на статью\учебник где хорошо описываются сессии

3)Ветка с установкой куки работает, но сама кука не устанавливается!!! 

В временной папке, где должны хранится идентификаторы сессии, создается файл, ток он пустой. 


Автор: awers 16.3.2008, 04:05
omg! SneG0K, причем же тут браузер. Покажи php.ini, покажи код на котором тестируешь (от <? до ?>, расскажи КАК тестируешь, а там получиш совет. 

Автор: Feldmarschall 16.3.2008, 04:34
Цитата(SneG0K @  16.3.2008,  03:28 Найти цитируемый пост)
Везде результат глух!!! 

Ну, это я опечатался, а ты даже не посмотрел.
разумеется, надо
Цитата

<?
setcookie("user","test",0);
echo $_COOKIE["user"];
?>

Цитата(SneG0K @  16.3.2008,  03:28 Найти цитируемый пост)
создается файл, ток он пустой


Что я тебе писал про session_register и session_destroy?

Цитата(SneG0K @  16.3.2008,  03:28 Найти цитируемый пост)
дайте линк на статью\учебник где хорошо описываются сессии


Вообще-то, я давал линк на статью/учебник.
но ты же вообще не читаешь, что тебе пишут :(

И где ответ на вопрос что у тебя находится в переменной $session?

Автор: SneG0K 16.3.2008, 10:35
Feldmarschall, твою ошибку я заметил! И исправил! И все твои посты я читаю! Внимательно читаю. Тот код первый который попался мне под руку! Повторяю еще раз, что в переменную $session будет передаваться идентификатор сессии! Короче, спасибо за помощь. Лучше, с таким отношением, я пойду почитаю еще какие-либо маны!

Автор: Feldmarschall 16.3.2008, 12:35
Проверь ещё раз, пожалуйста.
Действительно ли скрипт, содержащий ровно эти 4 строчки
<?
setcookie("user","test",0);
echo $_COOKIE["user"];
?>
при обновлении страницы ничего не выводит на экран?

Автор: SneG0K 16.3.2008, 18:32
Проверил. С таким содержанием. Перегружал винду, перегружал сервер - ничего! Просто не работает и все.

Автор: Sannis 16.3.2008, 18:36
Вы этот скрипт один раз запускали, или всё-таки перегружали страницу?

Автор: SneG0K 16.3.2008, 19:06
Перезагружал страницу по несколько раз smile Ну куки не работают и все! Ни в какую не хотят! Я вот думаю, что мож что-то в пхп.ини не так натворено?

Автор: ksnk 16.3.2008, 19:20
SneG0K, Можно начать с броузера. 
Скачать и поставить http://www.mozilla-europe.org/ru/products/firefox/, затем поставить ему https://addons.mozilla.org/ru/firefox/addon/3829

Затем "инструменты"->"Live Http Headers" , прейти в соседнюю вкладку и ввести адрес скрипта. Перегрузить его 2 раза (кнопкой релоад). Перейти во вкладку "live http headers" и сбросить сюда результат...

Автор: SneG0K 16.3.2008, 19:27
Оооо... Кстати очень вовремя smile Я какрас искал что-то для просмотра HTTP пакетов... Спасибо... Щас проверю и результат скину

Добавлено через 2 минуты и 43 секунды
Ыы.. а у мну нет фаерфокса. и походу она ловит только заголовки HTTP, мож уже что-то для полного отлова пакета?

Добавлено через 6 минут и 9 секунд
Ладно, счас скачаю лиса и скажу... Не стоит ругаться smile 

Автор: Canarat 16.3.2008, 19:33
SneG0K, а скачать и поставить сложно?

И cookies устанавливаются именно заголовком Set-Cookie, который кроме как HTTP-заголовком ничем другим не является

Автор: SneG0K 17.3.2008, 21:36
Все разобрался smile То с PHP проблемы были... новый скачал, сейчас все работает

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)