Sessions se neuloží do db
- Martin7
- Člen | 23
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
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);
}
}
- Martin7
- Člen | 23
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
- mas tam nekolikrat jen $conn namisto self::$conn
- 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
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.