Как определить факт "стартанутости" сессии ( isset ($_SESSION) не подходит )

Сергей123

Новичок
1) Ура! Ссылка сработала, и не я получу за диггерство :)).

2) svetasmirnova:
on_off вводить незачем (я писал: это накладывает определённые требования на окружение моей строчки), но действительно можно прямо _SESSION проверять предложенным тобою способом.
Его минусы для меня-дотошного:
- а если одновременно надо будет и GET'овую переменную с таким именем? :))
- собственно безусловный session_start() когда надо (с собакой или без - хрен с ним нотайсом) всё ещё лучше любых извратов, если только "не дать read-интерфейс к session_status".
 

svetasmirnova

маленький монстрик
>Ура! Ссылка сработала, и не я получу за диггерство :)).
/me долго гадала, почему пропустила тему =)
 

WP

^_^
Ну и тема))) Например у меня, сессия стартует всегда. Но, если нужно чтобы она стартовала только внутри некоторых сущностей, то я сделал бы
PHP:
function _session_status($status = NULL)
{
 static $started = FALSE;
 return is_null($status)?$started:($started = (bool) $status);
}
И договорился бы что после session_start() нужно делать
PHP:
_session_status(TRUE);
, а после session_write_close():
PHP:
_session_status(FALSE);
Т.е.
PHP:
if (!_session_status())
{
 session_start();
 _session_status(TRUE);
}
А засорять $_SESSION это некрасиво.
 

Сергей123

Новичок
Вариант "засорять $_SESSION" уже отвергнут, т.к. $_SESSION как такового уже достаточно для проверки, но слегка извратной и не идеальной (почему и не подходит).

Предложенный Вами вариант требует "договорённостей". В идеале хотелось бы этого избежать (я писал об этом выше).

Попробую привести какой-то пример что ли...
Ну, допустим так...
Ловит меня знакомый какой-нибудь и говорит, что на phpшном сайте, который ему кто-то там делал, есть поиск, и ему вот захотелось вдруг, чтобы если в течение этой сессии посетитель уже что-то искал, рядом с полем поиска была бы ссылка на рез-ты этого последнего поиска.
Сейчас я нахожу место, где "обрабатывается поиск" (before any output), и пишу там, например:
Код:
 @ session_start();
 $_SESSION['strLatestSearchPhrase'] = $s;
так как сессия мне нужна, а стартует она где-то или нет - хрен знает, нафиг надо искать.
А хотелось бы писать
Код:
 if (
     ! session_started()
 ) {
     session_start();
 } # if
 $_SESSION['strLatestSearchPhrase'] = $s;
Вот я о чём...
 

WP

^_^
Дык мой вариант такой же, просто нужно вручную менять статус.
И еще вопрос, почему бы не стартовать сессию всегда в самом начале? Зачем такие извраты?
 

Сергей123

Новичок
>> мой вариант такой же
Нет, :) session_started() - встроенная была б.

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

phprus

Moderator
Команда форума
Фанат
Ну почему же? Этот форум например тоже создает сессию для каждого посетителя. (Я только не помню умеет ли vB2.3.x не запускать сессию для поисковых ботов или нет. vB3.x.x точно умеет и не создает сессию для поисковиков) Так что в некоторых случаях запуск сессии оправдан. WP же не сказал в каких случаях он постоянно запускает сессию.
 

WP

^_^
Фанат
> ну и дурак.
Это почему?
> с кем договариваться?
Можно написать об этом в документации.
 

itprog

Cruftsman
Автор оригинала: Фанат
ну и дурак.
session.auto_start тоже дураки придумали ? :)

Автор оригинала: WP
Можно написать об этом в документации.
Кто ее читает... Программист знает о session_start, которую и вставит куда ему надо, максимум перед этим прочитает есть ли где-то раньше ее вызов.
 

GemVit

Новичок
Бресь Сергей
Не могу уловить почему не подходит вариант:
session_write_close();
session_start();
?
Для проверки, как вариант, если не важен ID сессии можно попробовать:
if (false === session_regenerate_id()) {
session_start();
}
Но не знаю в каких + случаях session_regenerate_id() может вернуть FALSE, кроме когда не стартанута сессия.
 

WP

^_^
Если не читает это его личная проблема. И пусть не удивляется ошибкам.
 

Фанат

oncle terrible
Команда форума
WP, мы поняли твоё предложение и приняли его к сведению.
 

Сергей123

Новичок
Дальше, пожалуй, бессмысленно.

Господа и дамы, я, на самом деле, давно знаю решение. Написать ф-ю самому, попытаться защитить её перед phpteam (или как там это делается?) и, если нет, - использовать один из уже обсосанных неидеальных вариантов.
 

cDLEON

Онанист РНРСlub
Бресь Сергей
Угу. Вариант с собственной либой сессий - смотрится лучше.
Я, например, так и сделал.
 

WP

^_^
Я тоже сделал свою либу сессий и долго пользовался ей, а потом стер и заменил на встроенный механизм. Потому что не надо изобретать велосипед, тем более с квадратными колесами.
 

SiMM

Новичок
Бресь Сергей, а чем вариант GemVitа не устроил? Если проблема в потере SID'а - она легко решается.
PHP:
function session_is_started(){
  $sid = session_id();
  $bool = session_regenerate_id();
  session_id($sid);
  return $bool;
}
 
Сверху