2009-11-23 3 views
4

Lorsqu'un utilisateur se connecte sur notre site Web, je souhaite modifier l'ID de session, mais conserver les données de la session. Je veux faire cela pour deux raisons:Modifier l'ID de session et conserver les données?

  1. Pour éviter un compte d'utilisateur à utiliser à plusieurs endroits en même temps (parce que si deux personnes utilisent le même compte, les actions d'un mineront les actions de l'autre) .
  2. Pour laisser l'utilisateur continuer ce qu'il faisait sur un autre ordinateur (par exemple, passer de l'ordinateur personnel au travail).

Cela peut sembler contradictoire, mais ce n'est pas le cas si vous y réfléchissez.

Le problème est le suivant: pour accéder aux données actuellement dans la session, je dois appeler le session_start(). Cela signifie que je ne peux pas appeler session_id() par la suite pour définir un nouvel ID de session. Des idées sur la façon de transférer les données de session et de modifier l'identifiant de session.

Mise à jour: Je dois être capable de choisir moi-même l'identifiant de session. session_regenerate_id() ne fonctionnera donc pas.

+0

'session_regenerate_id()' est la solution que Cletus a noté. – leepowers

+0

Comment allez-vous récupérer la session connectée avec un navigateur au travail pour une nouvelle session créée à partir d'un navigateur à la maison? – Don

+0

@Don: en définissant l'ID de session à régénérer pour cet utilisateur. @ pygorex1: 'session_regenerate_id()' ne fonctionnera pas, j'ai besoin de choisir moi-même le nouvel identifiant de session. –

Répondre

10

Vous pourriez être en mesure d'utiliser session_regenerate_id():

<?php 
session_start(); 

$old_sessionid = session_id(); 

session_regenerate_id(); 

$new_sessionid = session_id(); 

echo "Old Session: $old_sessionid<br />"; 
echo "New Session: $new_sessionid<br />"; 

print_r($_SESSION); 
?> 

ou même une approche plus grossière pourrait travail:

// save the session 
session_start(); 
$session = array(); 
foreach ($_SESSION as $k => $v) { 
    $session[$k] = $v; 
} 
session_commit(); 

// create new session and copy variables 
session_id("new session id"); 
session_start(); 
foreach ($session as $k => $v) { 
    $_SESSION[$k] = $v; 
} 
+0

La première approche devrait être suffisante. – powtac

+0

+1 m'aider aussi .. –

+1

Est-ce mal d'utiliser '$ session = $ _SESSION' puis (après avoir défini un nouvel identifiant de session)' $ _SESSION = $ session'? – TheFrost

-1

Ou, vous pouvez simplement être en mesure d'utiliser quelque chose comme ceci:

$path=session_save_path(); 
$whatever_session_id; 

passer ces variables à la page suivante:

session_id()=$whatever_session_id; 
session_save_path()=$path; 

Vous configureriez le chemin de la nouvelle ID de session aux anciennes données de session .... Je ne sais pas si cela est vraiment ce vous voudriez, soyez ici c'est.

0

Utilisez ceci. Mettez à une fonction:

function update_session($newsessid = '') { 

    // Backup the current session 
     $session_backup = $_SESSION; 

    // Set current session to expire in 1 minute    
     $_SESSION['OBSOLETE'] = true; 
     $_SESSION['EXPIRES'] = time() + 60; 

    // Close the current session 
     session_write_close(); 

    // Set a new session id and start the session   
     $newSession = session_id($newsessid); 
     session_start(); 

    // Restore the previous session backup 
     $_SESSION = $session_backup; 

    // Clean up 
     unset($session_backup);     
     unset($_SESSION['OBSOLETE']); 
     unset($_SESSION['EXPIRES']);  
} 

Vous pouvez ensuite appeler en cas de besoin:

update_session($customid); 
Questions connexes