522 votes

Vérifier si la session PHP a déjà commencé

J'ai un fichier PHP qui est parfois appelé à partir d'une page qui a lancé une session et parfois à partir d'une page qui n'a pas lancé de session. Par conséquent, lorsque j'ai session_start() sur ce script j'ai parfois le message d'erreur pour "session déjà commencée". Pour cela j'ai mis ces lignes :

if(!isset($_COOKIE["PHPSESSID"]))
{
  session_start();
}

mais cette fois, j'ai reçu ce message d'avertissement :

Avis : Variable indéfinie : _SESSION

Existe-t-il un meilleur moyen de vérifier si la session a déjà commencé ?

Si j'utilise @session_start Est-ce que cela fera fonctionner les choses correctement et fermera simplement les avertissements ?

901voto

Meliza Ramos Points 1409

Méthode recommandée pour les versions de PHP >= 5.4.0 , PHP 7, PHP 8

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

Référence : http://www.php.net/manual/en/function.session-status.php

Pour les versions de PHP < 5.4.0

if(session_id() == '') {
    session_start();
}

166voto

Alex Points 1977

Pour les versions de PHP antérieures à PHP 5.4.0 :

if(session_id() == '') {
    // session isn't started
}

Cependant, IMHO, vous devriez vraiment penser à remanier votre code de gestion de session si vous ne savez pas si une session est démarrée ou non...

Cela dit, mon opinion est subjective, et il existe des situations (dont des exemples sont décrits dans les commentaires ci-dessous) où il n'est peut-être pas possible de savoir si la session est lancée.

73voto

Benjamin Points 7314

Introduction de PHP 5.4 session_status() ce qui est plus fiable que de s'appuyer sur session_id() .

Considérez l'extrait suivant :

session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false

Donc, pour vérifier si une session est démarrée, la méthode recommandée en PHP 5.4 est maintenant :

session_status() == PHP_SESSION_ACTIVE

45voto

miyuru Points 360

Vous pouvez le faire, et c'est très facile.

if (!isset($_SESSION)) session_start();

22voto

Ryan Yoosefi Points 414

Avant PHP 5.4, il n'y a pas d'autre moyen fiable de le savoir que d'activer un drapeau global.

Pensez-y :

var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.

Ou :

session_id(); // returns empty string
session_start();
session_id(); // returns session hash
session_destroy();
session_id(); // returns empty string, ok, but then
session_id('foo'); // tell php the session id to use
session_id(); // returns 'foo', but no session is active.

Ainsi, avant PHP 5.4, vous devez définir un booléen global.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X