Не сохраняются сессии.

ezd

Guest
Не сохраняются сессии.

Написал несколько своих функций (класс) для замены сессий, что бы хранить в mysql. Так вот проблема, при закртытии страницы браузера, у него куки не сохраняются и при следующем заходе естественно, не отправив ID сессии, пхп генерирует ему новый.

В кратце выглядит так: При каждом заходе на страницу session_start(); и никаких setcookie не используется. Тут все работает, как надо. Когда юзер пытается авторизоваться на сайте, то я пишу setcookie($this->session_name,$this->session_id,time()+$time,"/"); и при отладке вижу, всё это в хейдер отправляется (типа Set-Cookie: SESSID=r7783 и т.д. с экспайр датой в GMT через пару месяцев). Но стоит закрыть страницу и зайти заного, так браузер снова ничего не выдает и получает новый ID. (куков на диске тоже не наблюдается, хотя вообще от сайтов браузер их получает, проверял на ИЕ и Опере)

Есть правда одно наблюдение..., когда я делаю setcookie($this->session_name,$this->session_id,time()+$time,"/");, то в заголовки попадает "похожая" надпись два раза, а именно первый раз вставляется откуда-то сама, то есть стандартная без expire даты, а просто SESSID=2904... и path=/. Потом идут остальные заголовки и потом только моя правильная строка. В какой момент вставляется первая строка с сессией я понять не могу, но явно не моими скриптами, а как-то автоматически.

Почему сессии не сохраняются? Есть какие-то идеи? Если нужна какая-то дополнительная информация может, которую не выложил, типа скрипта или каких-то настроек пхп?
 

Фанат

oncle terrible
Команда форума
прекрасно у тебя сессии работают.
как и надо.
браузер закрыли - сессия кончилась.
 

ezd

Guest
Так так, да не так. Надо что бы при возвращении пользователя на сайт все его данные восстанавливались. Как например на форуме, ведь не приходится авторизовываться каждый раз. Так и я хочу, что бы авторизовавшийся юзер сохранялся. Я так понял, надо что бы ID сессии сохранялся дольше, а для этого дату надо написать более позднюю. Разве нет? Но почему-то не сохраняется, кука на диск не пишется и браузер при следующем заходе её в хейдерах не отправляет. Или я что-то недопонимаю?

Поиск в куках по PHPSESSID находит кучу сайтов, а моего нет, хотя имя именно такое (дефолтное из php.ini).
 

ezd

Guest
Ок. Тогда вопрос такой. Что сохранять в куку? Я пытаюсь записать туда ID сессии. Может переименовать PHPSESSID во что-то другое или что?
 

Фанат

oncle terrible
Команда форума
в куку сохранять то, что ты хочешь восстановить при следующем заходе пользователя.

-~{}~ 12.06.06 16:45:

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

-~{}~ 12.06.06 16:46:

Как например на форуме, ведь не приходится авторизовываться каждый раз.
возьми, да посмотри, как это делается на форуме.
и сделай так же.
при чём здесь ессии?
 

ezd

Guest
У меня база такая:

`session_id` VARCHAR( 32 ) NOT NULL ,
`session_data` TEXT NOT NULL ,
`session_time` INT( 11 ) UNSIGNED NOT NULL ,

В session_data лежит сериализованный массив $_SESSION, соответсвенно нужная строка в базе определяется по `session_id`, который должен приходить от браузера, но он НЕ приходит, так как куки такой у браузера нет, а почему? :) В этом и основная проблема - браузер не возвращает PHPSESSID, дата которой должна истечь через 2 месяца только.

Движок работает .html файлами, может что-то с кешем или ещё что?

Вот так выглядит хейдер от сервера к браузеру при нажатии кнопки "войти" в странице:

Код:
HTTP/1.1 302 Found
Date: Mon, 12 Jun 2006 12:50:56 GMT
Server: Apache/2.0.54 (Win32) PHP/5.0.4
X-Powered-By: PHP/5.0.4
Set-Cookie: PHPSESSID=nk1apd03okgcme6n65ic3qic04; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=nk1apd03okgcme6n65ic3qic04; expires=Mon, 14 Aug 2006 12:50:56 GMT; path=/
Location: /
Content-Length: 0
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
После авторизации идет редирект на главную.

(главная) Браузер - сервер:
Код:
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Referer: http://h5/login.html
Accept-Language: ru
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: h5
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: PHPSESSID=nk1apd03okgcme6n65ic3qic04
(главная) Сервер-браузер:
Код:
HTTP/1.1 200 OK
Date: Mon, 12 Jun 2006 12:50:56 GMT
Server: Apache/2.0.54 (Win32) PHP/5.0.4
X-Powered-By: PHP/5.0.4
Set-Cookie: PHPSESSID=nk1apd03okgcme6n65ic3qic04; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 81
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: text/html
Вот здесь меня и смущает кое что. В последнем ответе сервера в хейдер снова пишется номер сессии без expire даты, может из-за этого браузер тут же удаляет только что поставленную куку? При закрытии окна и новом заходе браузер больше PHPSESSID не отправляет до обновления страницы и получения нового ID.

-~{}~ 12.06.06 17:05:

Именно, я понимаю, что сессия только до закрытия браузера и мне надо только сохранить ID, по которым восстановить данные. Мне кажется ID сессии прекрасно подходит для этого, разве нет? Просто браузер не восстанавливает сохраненные в куки данные. А почему я понять не могу.
 

Фанат

oncle terrible
Команда форума
так ты нагородил весь этот огород как раз для того, чтобы хранить данные в базе и восстанавливать между заходами?
сон разума рождает чудовищ...

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

для того, чтобы запомнить пользователя, и восстановить его данные из базы, служат куки.

что-то ещё из моих объяснений непонятно?
 

serglt

Анус, ой, Ахтунг
Нда... Учи сессии и как они работают.
При session_start автоматом записывается в куку твой айдишник, его туда писать в последствии не надо. А ты пишишь. Во вторых время жизни куки ставиться в пхпини.
По ентому таким макаром у тебя ничего не выйдет.
А на форуме просто сохраняются в куки логин и пароль и когда ты заходишь на него то из кук они берутся и происходит автологин. Если в куках нету логина и пароля то ничего не происходит. Вот и все :)
 

Фанат

oncle terrible
Команда форума
если ты до сих пор не понял - я тебе не объясняю, как решить твою проблему.
я говорю о том, что её вообще не надо решать.
а делать надо совсем по-другому. по-человечески.
 

serglt

Анус, ой, Ахтунг
Фанат прав!
Представь себе скока у тебя будет лишних файлов или записей в базе для каждого чела. Это будет педалить в итоге.
Так делать не надо!
 

ezd

Guest
serglt
Педалить? Круто :)

Фанат
serglt
Я кажется понял о чём вы. То есть в куку сохранять например логин и пароль, либо как-то зашифрованное ID пользователя, что бы его автоматом авторизовывать и создавать новую сессию, а не брать старую, так?
 
Сверху