Ale jeżeli ktoś się już nie zaloguje? Coś tam podłubie, niewyloguje się i zamknie przeglądarke
Chyba, że przed jakimolwiek zalogowaniem miałby sprawdzać czy czasy aktywnosci w bazie a nie w przypadku konkretnego usera.
Rozwiązanie nieidealne ale zawsze coś.
W międzyczasie przygotowałem kod. Tzn przerobiłem ten
http://php.net/manual/en/function.session-...ave-handler.php
class session
{
// session-lifetime
var $lifeTime;
// mysql-handle
var $db_connect;
function open($savePath, $sessName)
{
// get session-lifetime
$this->lifeTime = get_cfg_var("session.gc_maxlifetime"); // open database-connection
require "db_connection.php";
// return success
$this->db_connect = $db_connect;
return true;
}
function close()
{
$this->gc(ini_get('session.gc_maxlifetime')); // close database-connection
return mysqli_close($this->db_connect);
}
function read($sessID)
{
// fetch session-data
$query = "SELECT SessionData AS d FROM Sessions WHERE Id = '$sessID' AND SessionExpires > ".time();
$res = mysqli_query($this->db_connect, $query);
// return data or an empty string at failure
if($row = mysqli_fetch_assoc($res))
return $row['d'];
return "";
}
function write($sessID,$sessData)
{
// new session-expire-time
$newExp = time() + $this->lifeTime; // is a session with this id in the database?
$query = "SELECT * FROM Sessions WHERE Id = '$sessID' ";
$res = mysqli_query($this->db_connect, $query);
// if yes,
if(mysqli_num_rows($res)) {
// ...update session-data
$query = "UPDATE Sessions SET SessionExpires = '$newExp', SessionData = '$sessData' WHERE Id = '$sessID' ";
mysqli_query($this->db_connect, $query);
// if something happened, return true
if(mysqli_affected_rows($this->db_connect))
return true;
} else {
// if no session-data was found,
// create a new row
$query2 = "INSERT INTO Sessions (Id, SessionExpires, SessionData)
VALUES('$sessID', '$newExp', '$sessData')";
mysqli_query($this->db_connect, $query2);
// if row was created, return true
if(mysqli_affected_rows($this->db_connect))
return true;
}
// an unknown error occured
return false;
}
function destroy($sessID)
{
// delete session-data
$query = "DELETE FROM Sessions WHERE Id = '$sessID' ";
mysqli_query($this->db_connect, $query);
// if session was deleted, return true,
return true;
// ...else return false
return false;
}
function gc($sessMaxLifeTime)
{
// delete old sessions
$query = "DELETE FROM Sessions WHERE SessionExpires < ".time();
mysqli_query($this->db_connect, $query);
// return affected rows
return true;
}
}
$session = new session();
array(&$session,"close"), array(&$session,"write"), array(&$session,"destroy"),
Ale chyba nie działa tak jakbym chciał.
Zapisuje w polu 'Id' nazwę sesji, aktualizuje 'SessionExpires' w przypadku przeładowania strony ale w momenie gdy np. otworzę stronę na dwóch różnych przeglądarkach to mam tylko jeden wpis w bazie. Tak jakby się zastępował, a przecież gdy nie znajdzie 'Id' sesji to powienien tworzyć nowy.
I widzę też że sesja nie usuwa się z bazy danych.