2017-04-03 10 views
1

J'ai défini le stockage des sessions dans la base de données. Quand j'appelle session_destroy, il recherche session_id spécifique dans la base de données pour le supprimer. Comme l'identifiant de la session change souvent, le nouvel identificateur de session ne correspond pas à l'identificateur de session db qui a été stocké auparavant. Ces données de session ne sont donc pas supprimées. Même gc ne fonctionne pas non plus. Toutes les données de session sont enregistrées dans la base de données mais ne sont pas détruites.Pourquoi l'identifiant de session change-t-il souvent?

DbSessionHandler.php

class DbSessionHandler implements SessionHandlerInterface{ 

public $dbconnect; 
public function __construct($db){ 
    $this->dbconnect=$db; 
    session_set_save_handler(
     array($this, 'open'), 
     array($this, 'close'), 
     array($this, 'read'), 
     array($this, 'write'), 
     array($this, 'destroy'), 
     array($this, 'gc') 
    ); 
    register_shutdown_function(session_write_close()); 
    session_start(); 
} 

//make sure whether db connection is successfull 
public function open($savepath, $id) 
{ 
    return $this->dbconnect ? true : false; 
} 

public function close() 
{ 
    return true; 
} 

//read from database based on id, always return a string even if it is empty 
public function read($id) 
{ 
    $data = ""; //declare empty string, if no data found, can return this empty string 
    $session_row = $this->dbconnect->prepare("select session_data from session_store where session_id=:id"); 
    $session_row->execute(array(":id" => $id)); 
    if ($session_row->rowCount() > 0) { 
     $datas = $session_row->fetch(); 
     $data=$datas["session_data"]; 
    } 
    return $data; 

} 

/** 
* Write session_data using replace query (which does either insert or update) 
*/ 
public function write($id, $data) 
{ 
    if(!(empty($data))) { 
     $time = time(); 
     $session_write = $this->dbconnect->prepare("REPLACE INTO session_store VALUES(:id,:data,:expire)"); 
     if ($session_write->execute(array(":id" => $id, ":data" => $data, ":expire" => $time))) { 
      return true; 
     } 
    } 
    return false; 
} 

/** 
* Destroy 
*/ 
public function destroy($id) 
{ 
    $destroy = $this->dbconnect->prepare("delete from session_store where session_id = :id"); 
    if ($destroy->execute(array(":id" => $id))) { 
     return true; 
    } 
    return false; 
} 

/** 
* Garbage Collection 
*/ 
public function gc($max) 
{ 
    //Delete all records who have passed the expiration time 
    $time=time(); 
    $delete = $this->dbconnect->prepare("delete from session_store where session_expire < :oldtime"); 
    if ($delete->execute(array(":oldtime" => $time - $max))) { 
     return true; 
    } 
    return false; 
} 

}

fichier php qui démarre la session:

function initiate_session() 
{ 
$session_hash = 'sha512'; 
$session_name = 'some_name'; 
$secure = false; 
$httponly = true; 
ini_set('session.use_only_cookies', 1); 
ini_set('session.hash_function', $session_hash); 
ini_set('session.hash_bits_per_character', 5); 
$cookieParams = session_get_cookie_params(); 
session_set_cookie_params($cookieParams['lifetime'], $cookieParams['path'], $cookieParams['domain'], $secure, $httponly); 
session_name($session_name); 
new DbSessionHandler(db_connect()); 

}

session_id

Dans cette image, vous pouvez voir que session_id dans la table et session_id dans le script sont différents, ce qui empêche les données de session dans la base de données d'être supprimées.

+0

L'identifiant de session change-t-il pour les utilisateurs connectés ou pour les nouveaux utilisateurs? –

+0

Utilisateurs enregistrés. Parfois, certains enregistrements de session sont supprimés car il n'y aurait pas de changement d'identifiant de session. Parfois, il n'est pas supprimé en raison de l'identifiant de session différent pour le même utilisateur. Donc, la chose est, pas toujours les changements d'identifiant de session. – Learning

Répondre

-1

essayez d'utiliser ce session_regenerate_id (true); Passer une valeur booléenne TRUE détruira l'ancien identifiant de session et en créera un autre. Vous pouvez ajouter ceci à la fonction initiate_session().