8768 sujets

Développement web côté serveur, CMS

Bonsoir à tous
J'utilise tellement peu les sessions que je n'arrive pas à faire marcher un bout de code qui paraît à première vue sans problème.

Le contexte :
J'ai un fichier php qui est appelé au début de tous les fichiers php par un include_once
Cela me permet d'initialiser certaines variables globales qui sont utilisées un peu partout dans le code.
Je voudrais modifier ce fichier pour que les variables en question ne soient calculées qu'une fois par session

J'ai mis en tête deux lignes qui "détruisent" la session pour que les variables en question soient bien calculées à chaque appel pendant la période de test.
Cela donne :

session_start();  // si la session n'est pas démarrée, on ne peut pas la détruire
session_destroy();   // assure la fermeture de la session
if(!isset($USER) {           // $USER est l'une des variables globales en question
  session_start();
  $USER = $_SESSION['USER'];
  if(is_null($USER]) {      // c'est le début de la session
          .........      // calcul des variables et mise dans la session
 }
print_r($USER);

Maintenant que ce code fonctionne (essentiellement le calcul des variables en cause) je mets en commentaire les deux lignes de tête.
.... et là plus rien ne marche !
Je suppose que j'ai fait une grosse c... mais je ne parviens pas à trouver laquelle.

Une idée?
Modifié par PapyJP (10 Dec 2018 - 21:46)
Après réflexion, c'était un effet de bord d'un bug dans le code du calcul des variables.
Désolé
salut,

il y a un pb dans ta gestion de la session

// la gestion des sessions
session_start //démarre la session
session_destroy //cloture et vide toute la session 
$_SESSION[$key] = $var; //création d'une clé en session et ajout d'une valeur
unset($_SESSION); //permet de vider tous les champs de $_SESSION (toutes les sessions active) et laisse la session active
unset($_SESSION[$key]); //supprime la clé et sa valeur

//vérifie si la session est active et demarre la session si inactive
if (session_status() !== PHP_SESSION_ACTIVE)
{
    session_start();
}
else
{
    //to do
}


// ---------------------------------------------------------------------------------

session_start();  // si la session n'est pas démarrée, on ne peut pas la détruire
session_destroy();   // assure la fermeture de la session
if(!isset($USER) {           // $USER est l'une des variables globales en question
  session_start();
  $USER = $_SESSION['USER'];
  if(is_null($USER]) {      // c'est le début de la session
          .........      // calcul des variables et mise dans la session
 }
print_r($USER);


/*
Dans ton cas
1 tu demmares la session 
2 tu supprimes la session (ts les params sont vide du coup)
3 tu verifies la présence d'un variable $USER
4 Si elle n'existe pas tu redemarres une session (sans aucun parametres puisque vidés en N2)
5 tu créés la variable $USER et tu lui assignes une variable de session qui est vide ...
6 si $USER est vide (ce qui est le cas car tu lui assgnes une variable qui n'éxiste pas) tu commences un traitement
7 ton print_r affiche NULL


explique nous ce que tu souhaite faire avec tout le code pour que cela soit explicite

bon courage Smiley cligne
Modifié par biduletruck (11 Dec 2018 - 11:05)
Non, il n'y a pas de problème dans la gestion de ma session, il y avait un problème dans le code autour qui donnait l'impression que la session foirait.
C'est un peu trop compliqué pour que je vous explique ce qui ne marchait pas, pourquoi ça ne marchait pas et comment j'ai rétabli cet environnement.
Pour ceux que ça intéresse:
Autant que je sache une variable globale est propre à une "interaction", c'est à dire entre le moment où un programme PHP est lancé et le moment où il a fini la génération du code HTML qu'il est en charge d'exécuter.
Dans les programmes PHP de mon site, j'ai mis une page qui est appelée au début de tous les programmes pour générer un certain nombre de variables globales qui seront utilisées par ces programmes.
Parmi ces variables, il y en a en particulier une qui est un peu lourde à calculer, car elle nécessite le chargement d'un fichier xml et son analyse. Comme cette variable ne bouge pas pendant toute la "session" (qui est un ensemble d'interactions) j'ai voulu faire en sorte qu'elle ne soit calculée qu'une seule fois par session et sa valeur (un tableau de valeurs) stockée dans $_SESSION.
Quand on en arrive à tester un tel bout de code, il faut réinitialiser la session à chaque appel, sinon le code comprend que la "bonne" valeur de la variable est dans $_SESSION alors que son calcul n'a pas été fait correctement.
C'est pour cela que j'ai mis un code temporaire en tête de mon programme pour forcer le vidage de la session. J'aurais sans doute faire autrement pour cela, par exemple unset($_SESSION), mais j'ai fait autrement, peu importe.
Une fois que la variable a été correctement générée, j'ai retiré mes deux instructions temporaires et le programme ne fonctionnait plus comme j'espérais.
La raison est que j'avais mis trop de code dans la partie "si la session est neuve" et que d'autres variables n'avaient pas été initialisées.
Ce n'est que ce matin que j'ai compris ce qui se passait et que j'ai corrigé.
Voilà voiloù, désolé de vous avoir fait perdre du temps avec mes bugs.
Un retraité n'a pas de collègue à proximité pour échanger sur ce genre de problème, heureusement que ce forum existe!