web-dev-qa-db-fra.com

PHP Comment créer plusieurs sessions?

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!

14
Nathan

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

20
raidenace

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 :

  • Dans réponse de raidenace , deux sessions sont créées pour tous les clients partagés par tous les visiteurs du site Web.
  • Avec cette réponse, deux sessions sont créées pour chaque visiteur du site Web. Par conséquent, cela permettrait de stocker dans le $_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>";
0
humanityANDpeace