Widze, ze dosc ciekawa rozmowa byla tutaj prowadzona, lecz raptownie zakonczona, dlatego tez pozwole sobie odgrzac ten tamet, gdyz wydaje mi sie bardzo interesujacy, a pisac kolejnych nie ma sensu.
Po pierwsze sprawa braku usuwania sesji w bazie:
Cytat(Mery @ 9.03.2005, 11:56:38 )

U mnie pojawił się taki problem. Nie wiem czy nie mieszam, bo wydaje mi się to dziwne no ale tak jest.
Mianowicie przy kazdym wywołaniu session_start() najpierw wywoływana jest metoda _write, która zapisuje nową datę do bazy, a dopiero później sprawdzane jest czy sesja się nie przedawniła metodą _gc.
Przez to najpierw nadpisywana jest nowa data, wiec sesja nigdy sie nie przedawnia.
Gdy we _write zanim zostanie zupdatowany rekord w baze dodałem wywołanie _close, która wywołuje _gc to wszystko wydaje się działać dobrze.
Czy to jest normalne

Czy to może wina serwera, że najpierw updatuje, a poźniej sprawdza dopiero czy powinien

ps korzystam z wersji z artukułu, nie tej dostosowanej do php5
EDIT: a jeszcze lepiej gdy dodałem wywołanie _gc w metodzie _read, wtedy sprawdza czy sesja nie jest przedawniona zanim jeszcze cokolwiek z niej wczyta.
Ale czy tak nie powinno być normalnie ?
i to jest prawda, w takiej sytuacji u mnie nigdy nie dochodzilo do sytuacji by sesja z bazy zostala usunieta. Dodalem _gc do mtody _read przez co zaczelo usuwac sesje z bazy.
Mysle, ze nie tylko mi sie przydaly odpowiedzi na pytania poruszone przez autora poprzedniego posta:
Cytat(AxZx @ 9.07.2005, 22:47:05 )

czy zawsze lepiej stosowac session handler w mysql czy tylko wtedy gdy chce zliczac userow obecnie przebywajacyh na stronie, w konkretnym dziale itd.
czy ten session handler dziala w taki sposob ze user zamyka przegladarke, a nastepnie znowu wlacza i wchodzi na ta sama strone i znowu jest zalogowany?
dlaczego jak w jednym oknie przegladarki jestem zalogowany, otwieram drugie okno przegladarki i tez jestem zalogowany? czy to wina mojego skryptu czy tak ma dzialac session handler na mysql i to jest wlasnie ten czas zycia sesji?
do zliczania klikniec, wejsc na strone, itp, lepiej stosowac session handler czy mozna zwykle sesje w plikach?
Teraz moje problemy. Zaladowanie klasy i zastapienie podstawowych metod dla session, kodem:
<?php
array(&$session, '_close'), array(&$session, '_read'), array(&$session, '_write'), array(&$session, '_destroy'), array(&$session, '_gc')); ?>
Powinno odbyc sie tylko raz, na poczatku? U mnie przy zamieszczeniu tego na kazdej stronie pokazuje komunikac dotyczacy, ze nie moge powtornie zdeklarowac klasy.
Kolejne pytanie. Po usunieciu sesji z bazy dostaje nowa o takim samy id przy wlaczonej opcji cookie, tak ma byc?
Z gory dziekuje za wskazowki, ktore z pewnoscia nie tylko mi pomoga.
Pozdrawiam.
EditDaje szybka przerobke pod PHP5 i mysqli.
<?php
class Session
{
var $db_s;
var $session_table;
var $session_lifetime;
function __construct($db, $session_table, $session_lifetime = 0)
{
$this->db_s = $db;
$this->session_table = $session_table;
$this->session_lifetime = $session_lifetime;
}
function _open($session_savepath, $session_name)
{
return true;
}
function _close()
{
$this->_gc($this->session_lifetime);
return true;
}
function _read($session_id)
{
$this->_gc($this->session_lifetime);
$sql_query = "SELECT session_value FROM " . $this->session_table . " WHERE session_id = '" . $session_id . "'";
$result = $this->db_s->query($sql_query);
if ($result && $result->num_rows > 0)
{
$ww = $result->fetch_assoc();
$session_value = $ww['session_value'];
return $session_value;
}
else { return false; }
}
function _write($session_id, $session_value)
{
$sql_query = "INSERT INTO " . $this->session_table . " (session_id, session_start, session_time, session_value) VALUES ('" . $session_id . "', " . $session_start . ", " . $session_time . ", '" . $session_value . "')";
$result = $this->db_s->query($sql_query);
if ($result) { return true; }
else
{
$sql_query = "UPDATE " . $this->session_table . " SET session_time = " . $session_time . ", session_value = '" . $session_value . "' WHERE session_id = '" . $session_id . "'";
$result = $this->db_s->query($sql_query);
if ($result) { return true;}
else { return false; }
}
}
function _destroy($session_id)
{
$sql_query = "DELETE FROM " . $this->session_table . " WHERE session_id = '" . $session_id . "'";
$result = $this->db_s->query($sql_query);
if ($result) { return true; }
else { return false; }
}
function _gc($session_lifetime)
{
$session_lifetime = time() - $this->session_lifetime;
$sql_query = "DELETE FROM " . $this->session_table . " WHERE session_time < " . $session_lifetime;
$result = $this->db_s->query($sql_query);
if ($result) { return true; }
else { return false; }
}
}
$session_table = "sessions";
$session_lifetime = 10;
$session_go = new Session($db, $session_table, $session_lifetime);
array(&$session_go, '_close'), array(&$session_go, '_read'), array(&$session_go, '_write'), array(&$session_go, '_destroy'), array(&$session_go, '_gc'));
?>