Je veux être en mesure de basculer entre les sessions en php. Voici mon code actuel:
<?php
session_name("session1");
session_start();
$_SESSION["name"] = "1";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
session_name("session2");
session_start();
$_SESSION["name"] = "2";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
session_name("session1");
session_start();
echo "<pre>", print_r($_SESSION, 1), "</pre>";
Je veux le sortir
Array
(
[name] => 1
)
Array
(
[name] => 2
)
Array
(
[name] => 1
)
mais il sort
Array
(
[name] => 1
)
Array
(
[name] => 2
)
Array
(
[name] => 2
)
Est-il possible de basculer entre les sessions comme ça? Je n'ai pas besoin de deux sessions en même temps, mais je dois pouvoir basculer entre elles. Lorsque je lance ce code, je reçois deux cookies: session1 et session2 avec la même valeur.
Merci pour toute aide!
Ce que vous devez utiliser est session_id()
au lieu de session_name()
<?php
session_id("session1");
session_start();
echo session_id();
$_SESSION["name"] = "1";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
session_id("session2");
echo session_id();
session_start();
$_SESSION["name"] = "2";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
session_id("session1");
echo session_id();
session_start();
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
session_id("session2");
echo session_id();
session_start();
echo "<pre>", print_r($_SESSION, 1), "</pre>";
Cela va imprimer:
session1
Array
(
[name] => 1
)
session2
Array
(
[name] => 2
)
session1
Array
(
[name] => 1
)
session2
Array
(
[name] => 2
)
session_id
est un identifiant pour une session, ce qui aide à distinguer les sessions. session_name
est uniquement un alias nommé pour la session en cours
Comme l'indiquent les commentaires de la réponse existante , la solution proposée pourrait ne pas être idéale et j'aimerais proposer une solution de rechange. Soit une fonction nommée sane_session_name()
, qui ressemble à ceci:
function sane_session_name($name)
{
session_name($name);
if(!isset($_COOKIE[$name]))
{
$_COOKIE[$name] = session_create_id();
}
session_id($_COOKIE[$name]);
}
En utilisant la substitution "sane" pour session_name()
dans le code original du PO, on obtient ceci:
<?php
sane_session_name("session1");
session_start();
$_SESSION["name"] = "1";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_name("session2");
session_start();
$_SESSION["name"] = "2";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_name("session1");
session_start();
echo "<pre>", print_r($_SESSION, 1), "</pre>";
et cela donnera le résultat souhaité:
Array
(
[name] => 1
)
Array
(
[name] => 2
)
Array
(
[name] => 1
)
Qu'est-ce qui est différent?
Pour souligner la différence entre cette réponse et le réponse de raidenace :
$_SESSION
superglobal un contenu différent pour le visiteur Alice et Bob, tandis que dans les deux autres visiteurs du site Web, Alice un Bob "partagerait les données", et plutôt inutilement un cookie nommé PHPSESSID
avec la valeur session2. chaque fois et envoyer en arrière.Sécurité
Pour protéger ces "sessions multiples (par utilisateur)" de fixation de session et piratage de session, nous pouvons utiliser cette fonction
function sane_session_start($name)
{
ini_set("session.use_strict_mode",true);
ini_set("session.cookie_httponly",true);
session_name($name);
if(!isset($_COOKIE[$name]))
{
$_COOKIE[$name] = session_create_id();
}
session_id($_COOKIE[$name]);
session_start();
session_regenerate_id(true);
$_COOKIE[$name] = session_id();
}
et que le code de l'OP ressemble à ceci:
<?php
sane_session_start("session1");
$_SESSION["name"] = "1";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_start("session2");
$_SESSION["name"] = "2";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_start("session1");
echo "<pre>", print_r($_SESSION, 1), "</pre>";