Kod
storage:
class: sfPDOSessionStorageOverride
param:
session_name: pracainz
db_table: session
database: propel
db_id_col: session_id
db_data_col: session_value
db_time_col: session_time
class: sfPDOSessionStorageOverride
param:
session_name: pracainz
db_table: session
database: propel
db_id_col: session_id
db_data_col: session_value
db_time_col: session_time
Nadpisałem metodę sessionWrite klasy sfPDOSessionStorage:
Kod
class sfPDOSessionStorageOverride extends sfPDOSessionStorage
{
public function sessionWrite($id, $data)
{
// get table/column
$db_table = $this->options['db_table'];
$db_data_col = $this->options['db_data_col'];
$db_id_col = $this->options['db_id_col'];
$db_time_col = $this->options['db_time_col'];
$db_user_id_col = 'user_id';
$user = sfContext::getInstance()->getUser();
$user_id = false;
if ($user->isAuthenticated())
{
$user_id = $user->getGuardUser()->getId();
}
if ($user_id && ($user_id>0))
{
$sql = 'UPDATE '.$db_table.' SET '.$db_user_id_col.'= ?, '.$db_data_col.' = ?, '.$db_time_col.' = '.time().' WHERE '.$db_id_col.'= ?';
try
{
$stmt = $this->db->prepare($sql);
$stmt->bindParam(1, $user_id, PDO::PARAM_STR);
$stmt->bindParam(2, $data, PDO::PARAM_STR);
$stmt->bindParam(3, $id, PDO::PARAM_STR);
$stmt->execute();
}
catch (PDOException $e)
{
throw new sfDatabaseException(sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage()));
}
}
else
{
$sql = 'UPDATE '.$db_table.' SET '.$db_data_col.' = ?, '.$db_time_col.' = '.time().' WHERE '.$db_id_col.'= ?';
try
{
$stmt = $this->db->prepare($sql);
$stmt->bindParam(1, $data, PDO::PARAM_STR);
$stmt->bindParam(2, $id, PDO::PARAM_STR);
$stmt->execute();
}
catch (PDOException $e)
{
throw new sfDatabaseException(sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage()));
}
}
return true;
}
}
{
public function sessionWrite($id, $data)
{
// get table/column
$db_table = $this->options['db_table'];
$db_data_col = $this->options['db_data_col'];
$db_id_col = $this->options['db_id_col'];
$db_time_col = $this->options['db_time_col'];
$db_user_id_col = 'user_id';
$user = sfContext::getInstance()->getUser();
$user_id = false;
if ($user->isAuthenticated())
{
$user_id = $user->getGuardUser()->getId();
}
if ($user_id && ($user_id>0))
{
$sql = 'UPDATE '.$db_table.' SET '.$db_user_id_col.'= ?, '.$db_data_col.' = ?, '.$db_time_col.' = '.time().' WHERE '.$db_id_col.'= ?';
try
{
$stmt = $this->db->prepare($sql);
$stmt->bindParam(1, $user_id, PDO::PARAM_STR);
$stmt->bindParam(2, $data, PDO::PARAM_STR);
$stmt->bindParam(3, $id, PDO::PARAM_STR);
$stmt->execute();
}
catch (PDOException $e)
{
throw new sfDatabaseException(sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage()));
}
}
else
{
$sql = 'UPDATE '.$db_table.' SET '.$db_data_col.' = ?, '.$db_time_col.' = '.time().' WHERE '.$db_id_col.'= ?';
try
{
$stmt = $this->db->prepare($sql);
$stmt->bindParam(1, $data, PDO::PARAM_STR);
$stmt->bindParam(2, $id, PDO::PARAM_STR);
$stmt->execute();
}
catch (PDOException $e)
{
throw new sfDatabaseException(sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage()));
}
}
return true;
}
}
Dodałem kolumnę, która będzie przy sesji wpisywać id użytkownika, który się zalogował ale jest inny problem...
Otóż przy otwarciu strony z formularzem logowania sfGuardPlugin do bazy dodawany jest rekord. Np taki:
Cytat
8nnope4knm9l56p1brabjvt5c3 symfony/user/sfUser/lastRequest|i:1323421511;symfo... 1323421512 0
Następnie przy faktycznym zalogowaniu użytkownika na stronę tworzony jest kolejny rekord:
Cytat
epervhmgatp2t45rpc383u24j7 symfony/user/sfUser/lastRequest|i:1323421619;symfo... 1323421620 1
No i przy wylogowaniu jeszcze jeden rekord jest wstawiany do bazy:
Cytat
1rq7q4g4vb94doodenr7k45rc4 symfony/user/sfUser/lastRequest|i:1323421654;symfo... 1323421654 0
No i teraz pytanie. Jak zgrać to wszystko aby po wylogowaniu rekord danego użytkownika został skasowany a nie wpisywany nowy?