J'ai un fichier PHP qui est parfois appelé à partir d'une page qui a démarré une session et parfois à partir d'une page qui n'a pas de session démarrée. Par conséquent, lorsque j'ai session_start()
sur ce script, je reçois parfois le message d'erreur pour "session déjà démarré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:
Remarque: variable non définie: _SESSION
Existe-t-il un meilleur moyen de vérifier si la session a déjà commencé?
Si j'utilise @session_start
, cela fera-t-il fonctionner correctement et fermera-t-il simplement les avertissements?
php
session
session-variables
Logan
la source
la source
Réponses:
Méthode recommandée pour les versions de PHP> = 5.4.0, PHP 7
Référence: http://www.php.net/manual/en/function.session-status.php
Pour les versions de PHP <5.4.0
la source
session_start();session_write_close();
: alors la condition if échoue mais nous n'avons pas de session ouverte ...session_start()
en haut d'un script est FERMÉE lorsque le script se termine, OU quandsession_write_closed()
est appelée avant la fin du script. C'est-à-dire qu'une session se ferme quand ses données sont écrites dans le cookie de session et que la session est déverrouillée pour l'accès par un autre script qui appelle également 'session_start'. LA FERMETURE ne signifie PAS que la session est DÉTROYÉE, par conséquent. Vous pouvez fermer une session en quittant le script en cours ou en appelantsession_write_close()
, et vous pouvez l'ouvrir à nouveau en appelantsession_start()
. Ma compréhension, au moins.Pour les versions de PHP antérieures à PHP 5.4.0:
Cependant, à mon humble avis, vous devriez vraiment penser à refactoriser votre code de gestion de session si vous ne savez pas si une session est lancé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 peut ne pas être possible de savoir si la session a commencé.
la source
PHP 5.4 introduit session_status () , qui est plus fiable que de s'appuyer sur
session_id()
.Considérez l'extrait de code suivant:
Donc, pour vérifier si une session est démarrée, la méthode recommandée en PHP 5.4 est maintenant:
la source
vous pouvez le faire, et c'est vraiment facile.
J'espère que cela aide :)
la source
$_SESSION=array();
, donc cette réponse semble correcte.session_destroy()
a été appelé, il$_SESSION
peut encore être défini. En outre, dans les tests unitaires, vous pouvez définir$_SESSION
directement. Mais j'ai voté pour cela, car pour la plupart des situations pratiques, cette réponse devrait être assez bonne (jusqu'à ce que PHP 5.3 ne soit plus jamais vu ...)la source
Avant PHP 5.4, il n'y a pas de moyen fiable de savoir autre que de définir un indicateur global.
Considérer:
Ou:
Donc, avant PHP 5.4, vous devez définir un booléen global.
la source
Pour toute version php
la source
if ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
Vérifiez ça :
Source http://php.net
la source
Utilisez session_id () , il retourne une chaîne vide s'il n'est pas défini. C'est plus fiable que de vérifier le
$_COOKIE
.la source
J'espère que cela aide !
la source
Cela devrait fonctionner pour toutes les versions de PHP. Il détermine la version PHP, puis vérifie si la session est démarrée en fonction de la version PHP. Ensuite, si la session n'est pas démarrée, elle la démarre.
la source
La seule chose que vous devez faire est:
la source
Je ne suis pas sûr de l'efficacité d'une telle solution, mais cela provient du projet en cours. Ceci est également utilisé si vous devez définir la langue par défaut
la source
@
avant un appel de fonction supprime toutes les erreurs qui peuvent être signalées pendant l'appel de fonction.L'ajout d'un
@
avantsession_start
indique à PHP d'éviter d'imprimer des messages d'erreur.Par exemple:
L'utilisation d'une
session_start()
fois que vous avez déjà imprimé quelque chose dans le navigateur entraîne une erreur, donc PHP affichera quelque chose comme "les en-têtes ne peuvent pas être envoyés: démarré à (ligne 12)",@session_start()
échouera toujours dans ce cas, mais le message d'erreur n'est pas imprimé sur écran.Avant d'inclure les fichiers ou de rediriger vers une nouvelle page, utilisez la
exit()
fonction, sinon cela donnera une erreur.Ce code peut être utilisé dans tous les cas:
la source
Sur PHP 5.3, cela fonctionne pour moi:
alors vous avez. Si vous ne mettez pas le pas à si l'instruction commençant la session commencera de toute façon je ne sais pas pourquoi.
la source
Réponse BASÉE sur @Meliza Ramos Response (voir première réponse) et http://php.net/manual/en/function.phpversion.php ,
ACTIONS:
utilisez uniquement openSession ()
la source
En fait, il est maintenant trop tard pour l'expliquer ici de toute façon car il a été résolu. Il s'agissait d'un fichier .inc d'un de mes projets où vous configurez un menu pour un restaurant en sélectionnant un plat et en supprimant / ajoutez ou modifiez la commande. Le serveur sur lequel je travaillais n'avait pas la version actuelle, je l'ai donc rendue plus flexible. C'est aux auteurs qui souhaitent l'utiliser et l'essayer.
la source
Cet extrait de code vous convient-il?
la source
Vous devez réorganiser votre code afin d'appeler
session_start()
exactement une fois par exécution de page.la source
la source
PHP_VERSION_ID est disponible à partir de PHP 5.2.7, alors vérifiez d'abord et si nécessaire, créez-le.
session_status
est disponible à partir de PHP 5.4, nous devons donc vérifier cela aussi:la source
Sur la base de ma pratique, avant d'accéder à la,
$_SESSION[]
vous devez appeler àsession_start
chaque fois pour utiliser le script. Voir le lien ci-dessous pour le manuel.http://php.net/manual/en/function.session-start.php
Pour moi au moins,
session_start
c'est déroutant comme nom. Asession_load
peut être plus clair.la source
je me suis retrouvé avec une double vérification de statut. php 5.4+
la source
Vous pouvez utiliser la solution suivante pour vérifier si une session PHP a déjà démarré:
la source
C'est ce que j'utilise pour déterminer si une session a commencé. En utilisant vide et isset comme suit:
la source
Remplacez
session_start();
par:la source