11
votes

PHP: la session ne sauve pas avant la redirection de l'en-tête

J'ai lu le manuel PHP pour ce problème et il semble un problème assez courant, mais je n'ai pas encore trouvé de solution. Je sauve des sessions dans une base de données. Mon code est comme suit: xxx

alors au sommet de l'index.php après le session_start () , j'ai var_dumped the $ _session global et l'userid n'est pas là-bas. Comme je l'ai dit ive examiné via le manuel PHP ( http://php.net/manual/fr/function.session-write-close.php ) et ni session_write_close ou session_regenerèrent_id (true) a travaillé pour moi. Est-ce que quelqu'un connaît une solution?

Edit: j'ai session_start () en haut de mon fichier. Lorsque je Var_Dumpez la session globale avant la redirection de l'en-tête, je vois l'ID utilisateur là-bas, mais pas dans l'autre fichier, qui est dans un sous-répertoire de ce script


4 commentaires

Êtes-vous session_starting () où vous faites la redirection?


Et êtes-vous sûr que $ utilisateur-> id est défini?


Bonjour, veuillez consulter le commentaire que j'ai laissé pour @ ahmet2106's Post


Qu'est-ce que registre_globals State?


10 Réponses :


0
votes

Avez-vous eu une session_start (); sur le dessus?

non testé mais que vous ne pouvez pas faire quelque chose comme ceci: xxx

Je n'ai jamais ce problème avant, intéressant


3 commentaires

Oui. Quand i Var_Dump, la session globale avant l'en-tête redirige, c'est là-bas, il ne s'agit que lorsque je vais dans un nouveau fichier dans un sous-dossier du script d'origine.


@Matt Drôle, mais c'est vraiment intéressant, car il devrait y avoir défini la session, peut-être que tout autre code est en train de supprimer votre session, êtes-vous sûr de nulle part ailleurs est un session_destroy (); ?


Étrange, j'ai changé $ _Session ['userid'] à $ _Session ['UID'] et cela a fonctionné comme prévu. Je ne sais pas pourquoi les deux lettres majuscules font la différence. Je l'ai essayé avec Userid Aswell et c'était bien aussi. Des idées sur la raison pour laquelle cela n'accepterait pas d'IDERID? avec deux capitales, im déroulé



0
votes

userid n'a pas d'état de mot clé.

Une seule raison pour moi, c'est $ _Session ['userid'] est écrasé ou supprimé quelque part.

Assurez-vous d'utiliser Session-> Démarrer () dans tous les fichiers que vous souhaitez ajouter / accéder à la session.

Une chose importante (qui peut ne pas être applicable dans votre cas) est, si la session est manipulée à l'aide de Cookie, il est possible de faire des cookies pour être accessibles uniquement sous certains répertoires et sous-répertoires sous cela. Dans votre cas, de toute façon, le sous-répertoire aura accès à la session.


0 commentaires

4
votes

@matt (non capable de commenter encore ...): Si:

a) il apparaît dans la session avant de rediriger
b) D'autres clés fonctionnent

80% du temps que le problème est enregistré_globals et l'utilisation d'une variable nommée également $ Userid quelque part (les autres 19% consistent à écraser dans des endroits où on ne s'attend pas, 1% est incapable d'écrire / verrouiller la session avant de rediriger et des données étatiques, auquel cas vous pourrait essayer session_write_close () avant la redirection). Il va sans dire register_globals devrait être éteint: p


1 commentaires

3 années plus tard. session_write_close était le meilleur commentaire pour aujourd'hui!



0
votes

Assurez-vous que les deux pages sont la même version PHP (PHP5, PHP4 a parfois différents chemins de session)


0 commentaires

1
votes

Je n'ai pas entendu parler de cette question, mais je n'ai pas utilisé des sessions tout cela beaucoup.

Avec des sessions, vous devez faire quelques choses et avoir quelques paramètres de configuration:

  • Cookies activés sur le côté client
  • session_start (), avant tout ce qui se passe
  • Assurez-vous de ne pas détruire la session (sauf si elles ne veulent se déconnecter)
  • L'ID de session PHP doit être le même (concerne les cookies)

    Un autre problème pourrait être l'utilisateur $ User-> ID renvoie une référence à un objet qui n'existe pas à la page suivante. Probablement pas, mais assurez-vous.

    Si je voyais votre code, je pourrais vous aider beaucoup plus. Mais lorsque le débogage vérifie la clé de session avec session_id () et assurez-vous que c'est la même chose. Si vous pouviez essayer cela, dis-moi, je pouvais continuer à aider.

    Moi aussi, je voudrais savoir comment cela se termine lorsque je reviens dans des sessions.


0 commentaires

14
votes

Je sais que c'est un vieux Toppic mais j'ai trouvé la solution (pour moi). J'ai mis une sortie après l'en-tête.

$_SESSION['session'] = 'this is a session';
header('location: apage.php');
exit;


1 commentaires

Cela ne fonctionne que pour le même répertoire. Comment faire ce travail pour le sous-répertoire? F.e.: De http: /domain.com à http: /domain.com/subdir/?



0
votes

J'ai eu le même problème récemment. J'écris un site Web MVC personnalisé pour l'école et, comme tout le monde le dit, Start_Session () doit être écrit dans les toutes premières lignes de code.

Mon problème était l'emplacement de "session_start ()". Ce doivent être les premières lignes de votre contrôleur global, pas les premières lignes de la vue. $ _Session n'était pas accessible dans les fichiers du contrôleur car il n'a été initié que lorsque le serveur rend la vue. P>

alors, j'utilise session_write_close () après l'en-tête ('"Emplacement: xxx.php') Gardez les variables de la session pour la prochaine demande. P>

ex: p>

globalcontroller.php: p> xxx pré>

logoncontroller.php: p >

...
//Users is validated and redirected.
$_SESSION['client'] = $client;
header('location: index.php');
session_write_close();


0 commentaires

0
votes

C'était gênant comme l'enfer mais j'ai finalement compris une solution.

config.php j'ai eu: inclure 'session.php';

en haut de session.php, j'avais: session_start ();

en déplaçant session_start () en haut du fichier config.php, alto ...

problème résolu!


1 commentaires

C'est très bien que vous avez résolu le problème. Je vous conseillerai de vous informer de ne plus être plus propres dans votre solution afin d'aider les autres lecteurs aussi.



1
votes

Vous devez démarrer la session avant d'utiliser le tableau de session.

code PHP ,
session_start ();
$ _Session ['userid'] = $ utilisateur-> id;

Hauteur ('Emplacement: /SubDirectory/index.php');


0 commentaires

0
votes

Une autre option que de tuer votre script avec force avec EXIT est d'utiliser session_write_close pour forcer les modifications à écrire dans le magasin de session.

Cela ne devrait cependant pas arriver si votre script se termine correctement.

comme la documentation sur session_write_close États:

mettre fin à la session en cours et à stocker les données de session.

Les données de session sont généralement stockées après la fin de votre script sans la nécessité d'appeler session_write_close (), mais comme les données de session sont verrouillées Pour éviter que l'on écrit simultanément, un seul script peut fonctionner lors d'une session à tout moment. Lorsque vous utilisez des cadres de cadres avec des sessions, vous allez Découvrez les cadres en chargement d'un par un en raison de ce verrouillage. Vous pouvez réduire le temps nécessaire pour charger tous les cadres en mettant fin à la session comme dès que toutes les modifications apportées aux variables de session sont terminées.

Dans mon cas, cela ne s'est produit que pendant le débogage avec xdebug , lorsque j'ai déclenché le même script plusieurs fois et donc plusieurs processus ont essayé de manipuler la même session. En quelque sorte, la session ne pourrait alors plus être déverrouillée.


0 commentaires