Вы не зашли.
$_COOKIE['PHPSESSID'] - лучше не использовать дефолтовое название, а ставить свое
Код:
<?php |
|
define('SESSION_NAME', 'SID'); |
session_name(SESSION_NAME); |
|
if (isset($_COOKIE[SESSION_NAME])) { |
session_start(); |
|
if (! isset($_SESSION['SELF'])) { |
//Запрос к БД о наличии заданной session_id() |
//PHPSESSID=d65fjsmf8kc69ee8urb1glh855 |
//Можно было бы и SELECT COUNT(1) FROM `users` WHERE `PHPSESSID`='d65fjsmf8kc69ee8urb1glh855'; +- LIMIT 1; |
//Но надо, наверно, вытащить какую-нибудь важную инфу, поэтому скорее всего... |
//SELECT `uid` FROM `users` WHERE `PHPSESSID`='d65fjsmf8kc69ee8urb1glh855' LIMIT 1; |
if ($_/*Подсчет кол-ва затронутых строчек*/) { |
$_SESSION = array(); |
session_regenerate_id(); |
$_SESSION['SELF'] = true; |
//выплевываем данные с массива базы в массив сессии... |
} else { |
//отрубить сессию, может быть. |
$_SESSION = array(); |
session_destroy(); |
//$params = session_get_cookie_params(); |
setCookie(SESSION_NAME, null, $_SERVER['REQUEST_TIME'] - 1); |
//Доконца не понял че там этот session_destroy(); делает. |
//Как я понял: не очищает массив сессии, и не удаляет куку. |
} |
} |
} |
Отредактировано tipsun (2012.02.11 13:01)
да и не SID тоже, лучше подгонять под конкретный проект. на вапинете скажем, сессия SID может ставится и в блогах и на форуме. в таком случае они будут перезаписывать друг друга.
лучше называть что-то типа wapinet_blog, wapinet_forum и т.д.
Чет не удаляется печенюха с "лисы".
Простая сессия, кука пропадает после закрытия браузера.
Чет она не удаляется. Видимо только при закрытии браузера only.
Или все-таки можно удалить?
Код:
<?php |
define('SESSION_NAME', 'SID'); |
|
$_ = session_get_cookie_params(); |
//setCookie(SESSION_NAME, null, $_SERVER['REQUEST_TIME'] - 1); |
setCookie(SESSION_NAME, null, $_SERVER['REQUEST_TIME'] - 1, $_['path'], $_['domain'], $_['secure'], $_['httponly']); |
|
//session_set_cookie_params(null, '/', '.' . $_SERVER['HTTP_HOST'], false, true); |
//session_name(SESSION_NAME); |
//session_start(); |
|
echo $_COOKIE[SESSION_NAME]; |
Добавлено спустя 6 минут 39 секунд: Все, я понял в чем дело.

Код:
echo '<pre>'; |
print_r(session_get_cookie_params()); |
echo '</pre>'; |
Отредактировано tipsun (2012.02.13 15:03)
И зачем
session_get_cookie_params() вообще нужна, если она нифига не работает...
Можно как-то о куке которая у браузера узнать побольше?
- - - -
Точнее работает, когда указано явно
session_set_cookie_params() или через
ini_set() наверно.
Отредактировано tipsun (2012.02.13 18:06)
tipsun написал:
И зачем session_get_cookie_params() вообще нужна, если она нифига не работает...
работает в соответствии с документацией.
на серверных языках о куках особо инфы не получить. видимо.
Код:
<?php |
|
define('SLASH', DIRECTORY_SEPARATOR); |
|
define('SESSION_NAME', 'SID'); |
define('SESSION_LIFETIME', 604800); //1 week/неделя |
define('SESSION_PATH', SLASH); |
define('SESSION_DOMAIN', '.' . $_SERVER['HTTP_HOST']); |
define('SESSION_SECURE', false); |
define('SESSION_HTTPONLY', true); |
|
session_name(SESSION_NAME); |
if (isset($_COOKIE[SESSION_NAME])) { |
session_start(); |
if (! isset($_SESSION['SELF'])) { |
//Запрос к БД о наличии заданной session_id() а проще $_COOKIE[SESSION_NAME] |
//SELECT `uid` FROM `users` WHERE `PHPSESSID`='d65fjsmf8kc69ee8urb1glh855' LIMIT 1; |
$_SESSION = array(); //на всякий случай... |
if ($query_rowCount) { |
session_set_cookie_params(SESSION_LIFETIME, |
SESSION_PATH, |
SESSION_DOMAIN, |
SESSION_SECURE, |
SESSION_HTTPONLY); |
session_regenerate_id(true); //копирует инфу в новый файл + удаляет старый файл. |
$_SESSION['SELF'] = true; //самоидентификация типа (есть файл или нет чтоб потом посмотреть). |
//выплевываем данные с массива базы в массив сессии... |
} else { |
session_destroy(); |
setCookie(SESSION_NAME, |
null, |
0, |
SESSION_PATH, |
SESSION_DOMAIN, |
SESSION_SECURE, |
SESSION_HTTPONLY); |
} |
} |
} |
|
//echo '<pre>'; |
//print_r($_SESSION); |
//echo '</pre>'; |
Добавлено спустя 8 минут 17 секунд: Указал в параметрах куки сессии SESSION_LIFETIME из соображений, если пользователь зашел на сайт, а файла нет, то скорее всего его долго не было. А раз долго не было, а кука сохранилась, значит он нажимал на (запомнить).
Хотя может я и не прав. Время жизни файла сессии по умолчанию вроде, как помню, 1440 секунд
Отредактировано tipsun (2012.02.14 01:01)
Ну можно довести сохранение файла сессии до 60*60*6 = 6 часов или сделать 12 часов, не знаю.
Вероятность ошибочного присвоения метки (запомнить) будет меньше, наверно...
Отредактировано tipsun (2012.02.14 00:12)
Вроде, готово.
Код:
<?php |
//+ Это можно отдельно где-то держать... |
define('DS', DIRECTORY_SEPARATOR); |
|
define('SESSION_NAME', 'SID'); |
define('SESSION_LIFETIME', 604800); //1 week/неделя |
define('SESSION_PATH', DS); |
define('SESSION_DOMAIN', '.' . $_SERVER['HTTP_HOST']); |
define('SESSION_SECURE', false); |
define('SESSION_HTTPONLY', true); |
//- Это можно отдельно где-то держать... |
include_once 'db.php'; //PDO Driver |
|
session_name(SESSION_NAME); |
if (isset($_COOKIE[SESSION_NAME])) { |
session_start(); |
if (! isset($_SESSION['SELF'])) { |
$_SESSION = array(); |
$query = $db->prepare("SELECT `uid` FROM `users` WHERE `session_id`=? LIMIT 1;"); |
$query->execute(array($_COOKIE[SESSION_NAME])); |
if ($query->rowCount()) { |
$_SESSION['SELF'] = true; |
session_set_cookie_params(SESSION_LIFETIME, |
SESSION_PATH, |
SESSION_DOMAIN, |
SESSION_SECURE, |
SESSION_HTTPONLY); |
session_regenerate_id(true); |
$_SESSION += $query->fetch(PDO::FETCH_ASSOC); |
$query = $db->prepare("UPDATE `users` SET `session_id`=:new WHERE `session_id`=:old LIMIT 1;"); |
$query->execute(array(':old' => $_COOKIE[SESSION_NAME], ':new' => $_COOKIE[SESSION_NAME] = session_id())); |
} else { |
session_destroy(); |
setCookie(SESSION_NAME, |
null, //Session value |
0, //Session lifetime |
SESSION_PATH, |
SESSION_DOMAIN, |
SESSION_SECURE, |
SESSION_HTTPONLY); |
} |
} |
} |
|
///* |
echo '<pre>'; |
print_r($_COOKIE); |
echo '</pre>'; |
//*/ |
Отредактировано tipsun (2012.02.16 17:05)
В базе нужно будет помимо `session_id` сделать еще `session_expire`, а то кука удалится, а поле в базе с этим `session_id` будет активна.
Мне так кажется.
Отредактировано tipsun (2012.02.29 16:04)