Je fais un système de connexion, mais lorsque un utilisateur se connecte, il ne stocke pas réellement aucune des données que je souhaite dans la session. J'ai même vérifié le dossier de la session et c'était vide. J'ai session_start (); sur toutes les pages. Que pourrais-je me tromper. Heres le code pour les deux pages principales.
Le code de connexion: p> L'en-tête qui est inclus dans chaque page: p> Un petit fond: p>
18 Réponses :
Assurez-vous que votre session.Save_Dir est définie correctement. Si vous êtes sur quelque chose comme un temple de média où vous êtes hébergé à la maison / #### / domaines / html, il pourrait ne pas être réglé correctement et ne serait pas enregistré. P>
Bon point, mais le fichier de session étant vide i> (plutôt que inexistant) me fait penser que ce n'est pas le problème dans ce cas.
On dirait que le cookie de sessionID n'est pas défini p>
Je suggère d'utiliser p>
error_rporting (e_all); p>
dans le début de chaque fichier p> li>
Deuxièmement, je pense que le problème est que vous incluez 2 sessions_starts, et ce qui se passe, est que vous ne suivez pas la même session_id que vous pensez. p> li> ul>
Même avec E_all Error Reporting sur, il ne crache toujours aucune erreur. Avec la fonction d'en-tête (), cela ne redirige-t-il pas à l'autre page? cause qui ne ferait pas qu'il a deux sessions_starts. Ou aussi, incluez-vous l'autre page de traitement à cet endroit?
Deux appels vers session_start () code> ne causeraient pas ce problème. Du manuel: "À partir de [Version 4.3.3], Calling Session_Start () Bien que la session ait déjà été démarrée entraînera une erreur de niveau e_notice. En outre, le début de la deuxième session sera simplement ignoré."
J'ai vu des problèmes étranges apparu lorsque Session_Start () n'est pas la première ligne de code de la page. Essayez de déplacer votre session_start () S ci-dessus votre inclut et nécessite et voyez si cela le corrige. P>
Le seul problème avec c'est que j'ai besoin d'inclure «user.class.php»; avant la session_start () parce que je stocke un objet dans la session. ce qui l'oblige à être avant la session_start (); Je pense bien que cela ne soit pas une option viable. Voilà pour économiser sur les requêtes.
La sessionID est nulle part à être trouvée. J'ai eu ce problème une fois, des sessions ont été créées comme une folle mais rien n'a été stocké. (Aussi, assurez-vous d'avoir des autorisations d'écriture appropriées dans le dossier de session, une fois que vous avez eu un problème de ce type) P>
Ce que vous voulez vraiment faire, c'est p>
$ sessid = session_start (); // pour le début d'une nouvelle session et p>
session_start ($ sesssid); // à la demande de démarrage pour chaque appel ultérieur jusqu'à ce que la session soit détruite à l'aide de session_destroy () p>
Bien sûr, passer la variable de $ sesssid entre les pages Web est à vous de vous. Je préfère utiliser un additif A & sessid = link;> (De cette façon, je sais immédiatement quand quelque chose est parti maladi; p) p>
N'oubliez pas que le seul moyen d'assurer la restauration correcte de la session est de transmettre l'ID de session. Je sais que c'est facultatif, et sur la plupart des systèmes, il ne devrait que travailler hors de la case, mais parfois, cela ne signifie tout simplement pas, et il n'ya tout simplement aucune garantie sur le comportement de la session sur l'hébergement partagé. P>
Tout comme un protip, essayez d'envelopper vos sessions dans une classe avec «Magic» Les gestionnaires par défaut pour __set () et __get (), pourraient rendre votre vie un peu plus facile ultérieurement pour la vérification des données de session (le gestionnaire __CALL (). esp. utile pour cela). Et rendre le constructeur de la classe s'attendre à un ID de session, avec 0 (ou -1 ou autre) étant «Démarrer une nouvelle session» et assurez-vous qu'il crie des erreurs si l'ID n'est pas défini explicitement - cela vous alertera sur < Code> évident code> problèmes. p>
---------- [EDIT P>
Et Oh, ai-je mentionné - dans un environnement partagé avec des lots et beaucoup de demandes d'utilisateurs, ne pas nommer que vos sessions peuvent explicitement conduire à des problèmes de saignement (un utilisateur étant enregistré comme un autre). Pour la plupart, cela ne se produit pas, mais si vous avez une configuration d'hébergement vraiment vissée, vous ne nommez pas vos sessions et que vous appuyez sur «comportement par défaut», peut entraîner des catastrophes multiples à la fois. ; -) p>
Google garde l'identifiant de la session dans l'URL.
Passer manuellement l'identifiant de la session autour n'est vraiment pas une bonne solution. C'est ce que le cookie de la session est pour.
des risques! Même vous devez régénérer l'ID de la session sur chaque demande de raisons de sécurité!
Basé sur un commentaire dans la php en-tête () A > Documentation, je pense que vous devez faire ce qui suit au bas de votre dossier. en-tête ('emplacement: x'); code> est un cas particulier d'utilisation de la fonction
code>, et elle peut interférer avec la session qui passe si une session n'a pas eu le temps de Écrivez avant que l'en-tête
() code> est émis. session_write_close () doit résoudre ce problème.
...
session_write_close();
header('Location: index.php');
Après avoir lu les documents, je pensais que cela le ferait, mais cela ne semblait pas changer quoi que ce soit.
coup long mais mérite de mentionner:
PHP est-il configuré correctement pour gérer des sessions?
Quelle est la sortie phpinfo ()? P>
Regardez vos paramètres PHP.ini. En particulier, vous souhaitez définir session.auto_start code> sur 0 si vous faites manuellement
session_start () code>. Et si vous comptez sur la session Cookie ou la réécriture de l'URL transparente, vous aurez besoin de
session.use_cookies = 1 code> et / ou
session.use_trans_sid = 1 code> aussi. p>
session.auto_start est à 0. session.Utilise_cookies est à 1 et session.trans_sid = 0
Voici quelques suggestions (Je ne sais pas vraiment ce qui se passe et / ou pourquoi; donc ce ne sont que des suggestions; peut-être que l'on résoudra le problème ^^) em>. . . Tous, quelques questions:
première idée: Et si vous définissez une tête pour désactiver la mise en cache par le navigateur?
Quelles sont les autorisations sur le répertoire de la session et sur les fichiers (vides) qui sont créés? P> Bien chance! p> p>
(ils comptent au moins si aucune de ces suggestions ne fait l'affaire) em> p>
var_dump ($ _ session); Die; code> à la fin du script qui définit les données en session, que donne-t-il? Li>
ul>
p>
trucs comme ceci, par exemple: p>
Deuxième idée (au moins si vous êtes sous Windows): Avez-vous essayé de vous désactiver antivirus / pare-feu?
est le cookie de session correctement créé dans le navigateur du client?
Si vous utilisez des sous-domaines (ou non): Le domaine de la cookie est-il OK? Qu'en est-il de la date d'expiration? P>
Troisième idée: p>
error_rporting code> est défini sur
e_all code>, qui est gentil li>
display_errors code>? Est-il défini sur sur de sorte que les erreurs soient affichées? LI>
ERROR_LOG CODE>? LI>
ul>
Un autre: êtes-vous sûr qu'il n'y a absolument rien qui accède à la sortie avant le session_start code>? Pas même des espaces blancs? P>
Encore un autre: êtes-vous sûr des autorisations sur les répertoires / fichiers? P>
Je commence à manquer d'idées ... avec un peu de chance, peut-être que l'un de ceux-là sera le bon ... ou vous aider à découvrir ce que le bon serait! P>
La chose de contrôle du cache ne semblait pas faire la différence. toujours avoir le même problème. J'ai essayé dans plusieurs navigateurs et sur plusieurs ordinateurs et plusieurs serveurs et son même problème. De plus, je me suis assuré que les erreurs d'affichage étaient également activées. Merci pour les suggestions!
Oh :-( Dommage :-( Si vous rencontrez le même problème avec différents navigateurs, sur différents ordinateurs et serveurs, il peut y avoir une sorte de problème avec votre code après tout ... pourriez-vous par hasard faire une archive contenant le code source complet, s'il n'est pas grave / difficile à configurer, nous pouvons donc essayer de regarder de plus près?
Je dois être d'accord avec ce que Jason a dit plus tôt. Il suffit d'ajouter le modifier votre code comme celui-ci p> suivi du reste de votre code ... P> J'espère que cela résout le problème. P> P> session_start (); code> ligne avant tout dans le script de connexion. Mettez-le juste après la fonction de session_start () n'importe où, pas même dans l'en-tête.
Parce qu'il stocke des objets de classe dans la session, il doit inclure la défense de la classe avant session_start (). Personnellement, je convertis des objets de classe aux chaînes avant de stocker en session. Vous pouvez les convertir explicitement en XML.
hmmm, désolé je n'étais pas au courant de ça.
Vérifiez votre inclusion pour les lignes de fin. Parfois, une nouvelle ligne après la fermeture?> Sera émise et empêchera la création de la session. Ça m'a mal sérieusement avant que je ne l'ai compris. P>
Très bon point, j'ai déjà eu ce problème, mais ce n'est pas le problème cette fois = /
Une cause probable est que l'exécution continue après l'en-tête ("Emplacement ..."). Cependant, on dirait que vous voulez qu'il s'arrête, vous devriez donc ajouter 'sortie;' Après avoir redirigé vers Error.PHP. E.G.:
header('Location: index.php');
PI -CHIS pourrait également faire partie de votre problème, car vous n'allez jamais à ERROR.PHP et voir le code d'erreur. La dernière ligne est toujours exécutée: p>
if ($u_result == false) { $url = 'Location: error.php?id=8'; header($url); exit; }
J'ai testé le code et j'ai même répliqué les paramètres INI que vous avez. P>
J'ai fait des objets simples pour remplacer dB et utilisateur. Et à cause de ce que Daremon a déclaré, si l'un des Les chèques liés à l'échec de l'utilisateur et de la DB échouent, il affichera toujours une page d'index vide (mon index de test imprimait le contenu du superglobal $ _session). P>
Ainsi, est-il possible que l'erreur soit dans les classes dB ou utilisateur? Avez-vous testé ceux-ci? Pour voir si le problème réside sur ces classes, il est simple d'ajouter une sortie après chaque appel comme Daremon dit. P>
Tout d'abord: quelle version de php hébergez-vous sur?
dans les versions PHP session_start () retournera toujours vrai, même si le démarrage de la session échoue. (Voir le Changelog .) P>
Deuxièmement: Avez-vous essayé P>
require_once("header.php");
créer un nouveau fichier appelé session_test.php contenant: p>
aller à http: //: /session_test.php dans un navigateur p> li>
Cela s'assurera que le problème est dans la combinaison PHP / Apache | IIS et non dans tous les autres code. P> P> si (Isset ($ session ['orbage']) &&! vide ($ session ['orbage'])) {
echo 'Données de session:'. $ Session ['ordures'];
}
autre {
$ Session ['ordures'] = 'J'aime le gâteau';
echo 'Données de session écrites ";
}
code>
?> li>
Allez sur ce site et téléchargez le système de connexion fini (super site de tutoriel!), c'est la même chose que le vôtre! p>
http://net.tutsplus.com/videos/screencasts/how-to-build-a-login-system-for-a-simple-website/ p>
Cela peut ne pas répondre à votre problème de session, mais résoudre le sujet de manière presque égale; d p>
Cela ne ressemble pas à la cause de vos problèmes ici, mais comme vous n'avez pas encore trouvé de solution, vous pouvez également vérifier si votre hôte utilise Balance de charge forte> sans synchroniser des données de session. Cela signifie que votre utilisateur pourrait être envoyé à un autre serveur pour chaque requête, et à moins que le répertoire de données de session soit partagé sur tous ces serveurs, vos données de session seront perdues. P>
Prouré probablement pas le cas ici, mais cela m'a provoqué un mal de tête grave il y a un moment, alors je le pose juste au cas où. P>
J'avais le même problème. Ma solution était un peu différente du reste ici. Dans mon fichier Et dans mon code, disons que j'ai eu une session donc assurez-vous que php.ini code>, j'ai eu ce paramètre
register_globals = on code>. P>
_ _ "utilisateur] code> et ultérieurement dans mon code attribué quelque chose à
$ utilisateur code> remplaçait mon < Code> $ _ Session ['utilisateur'] code> Informations avec tout ce que j'avais affecté à
$ utilisateur code>. p>
register_globals code> est désactivé ou modifiez vos noms de variable. = D p>
L'espace disque peut également être l'un des problèmes, n'oubliez pas de vérifier votre espace disque, s'il est rempli, il ne peut pas être écrit. P>
Vous devez mettre de la session_start en haut de votre premier fichier PHP.
@Mrhus: pas vrai. Vous devez seulement appeler Session_Start () avant de produire quoi que ce soit sur le navigateur.
Salut, avez-vous déjà résolu cela? Ma réponse a-t-elle identifié un vrai bug?
Oui Deramon, votre réponse était la bonne. Mais au moment où je l'ai vu, je l'avais compris moi-même, et j'ai donc accepté automatiquement une réponse = / désolé.