Sessions se neuloží do db

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Martin7
Člen | 23
+
0
-

Ahoj, mám problém při ukládání session do databáze. Vytvořil jsem si třídu MySessionStorage:

class MySessionStorage extends Object implements ISessionStorage {

	function open($savePath, $sessionName)
	{

	}

	function close()
	{
	}

	function read($id)
	{
		return dibi::fetchSingle('
                    SELECT [data]
                    FROM [session]
                    WHERE [id] = %s', $id
                    );
	}

	function write($id, $data)
	{
                return dibi::query('INSERT INTO [session] VALUES(%s, %s, %s)', $id, time(), $data);
	}

	function remove($id)
	{
		return dibi::query('DELETE FROM [session] WHERE [id] = %s', $id);
	}

	function clean($maxlifetime)
	{
                $old = (time() - $maxlifetime);
                return dibi::query('DELETE FROM [session] WHERE [timestamp] < %s', $old);
	}
}

A v bootstrapu mám:

$session = Environment::getSession();
$session->setExpiration('+ 356 days');
$session->setStorage(new MySessionStorage);
if(!$session->isStarted()) $session->start();

Když se zkusím přihlásit tak se session neuloží do databáze, nenapíše to žádnou chybu, ani v logu nic není. V prohlížeči do cookies se ukládá PHPSESSID s expirační dobou jakou jsem nastavil.
Pokud smažu v boostrapu $session->setStorage(new MySessionStorage); tak přihlašování funguje.

Nevíte v čem by mohl být problém?

Martin7
Člen | 23
+
0
-

Nikdo neví :( Poradíte mi alespoň jak mám zabránit tomu, že přihlášení vydrží pouze asi 3 min?

Jan Endel
Člen | 1016
+
0
-

Je potřeba také implementovat metodu open a close

Martin7
Člen | 23
+
0
-

metodu close a open jsem doplnil takto a porad nic.

class MySessionStorage extends Object implements ISessionStorage {

   private static $conn = null;

	function open($savePath, $sessionName)
	{
            self::$conn = dibi::connect(array(
    'driver'   => 'mysql',
    'host'     => '..',
    'username' => '..',
    'password' => '..',
    'database' => '..',
    'charset'  => 'utf8',
    'lazy' => TRUE
));

	}

	function close()
	{
            self::$conn = null;
	}

	function read($id)
	{
		return self::$conn->fetchSingle('
                    SELECT [data]
                    FROM [session]
                    WHERE [id] = %s', $id
                    );
	}

	function write($id, $data)
	{
                return self::$conn->query('INSERT INTO [session] VALUES(%s, %s, %s)', $id, time(), $data);
	}

	function remove($id)
	{
		return self::$conn->query('DELETE FROM [session] WHERE [id] = %s', $id);
	}

	function clean($maxlifetime)
	{
                $old = (time() - $maxlifetime);
                return self::$conn->query('DELETE FROM [session] WHERE [timestamp] < %s', $old);
	}

}
Jan Endel
Člen | 1016
+
0
-

Implementoval jsi ji způsobem, že nemají jakoukoliv funcionalitu v sobě, na těch odkazech máš přesně popsáno, co mají ty funkce dělat. Udělej je podle toho.

Martin7
Člen | 23
+
0
-

Funkce open a close jsem upravil takto:

private static $conn = null;

function open($savePath, $sessionName)
	{

            if (is_null(self::$conn)) {

            self::$conn = dibi::connect(array(
                'driver'   => 'mysql',
                'host'     => '..',
                'username' => '..',
                'password' => '..',
                'database' => '..',
                'charset'  => 'utf8',
                'lazy' => TRUE
                ));
            }

            if($conn != null) {
                return 0;
            }else {
                return 1;
            }

	}

	function close()
	{
            self::$conn = null;

            if($conn == null){ return 0;}else{ return 1;}

	}

Session se párkrát uložilo do databáze, ale po chvíli to začalo psát chybu: session_start(): Undefined variable: conn přitom proměnná definovaná je. Můžeš mi prosím ukázat příklad jak by to mělo správně být?

Editoval Martin7 (15. 2. 2012 1:15)

marek.dusek
Člen | 99
+
0
-
  1. mas tam nekolikrat jen $conn namisto self::$conn
  2. semantiku open/close jsem nezkoumal, ale nevim, jestli to spis nema byt ve smyslu „otevrit/zavrit session“ (tj. nacist/ulozit data), ne db
Martin7
Člen | 23
+
0
-

to self::$conn jsem přidal všude to vyřešilo problém s tou chybou session_start(): Undefined variable: conn, ale session se neukládáji. Do funkce open jsem zkoušel přidat:

$session = Environment::getSession();
$session->start();

ale potom mi to vypíše 500 Internal Server Error.

Jan Endel
Člen | 1016
+
0
-

tohle nepomůže?

Martin7
Člen | 23
+
0
-

Tak jsem to dal nějak dohromady, teď se mi session ukládá do databáze, ale můj problém to nevyřešilo. Asi tak po 3min se mi to automaticky odhlásí :(. Nevíte jak to vyřešit? Díky

Edit:
Na localhostu to funguje bez problémů.

Editoval Martin7 (18. 3. 2012 23:44)