9
votes

Données de session PHP non stockées

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: xxx

L'en-tête qui est inclus dans chaque page: xxx

Un petit fond:

  • Windows 7 (également essayé sur Windows
  • Server 2008, mais actuellement sur 7) PHP
  • 5 Problème accueilli localy est présent
  • pour tout le monde problème existe dans tout
  • navigateurs

4 commentaires

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é.


18 Réponses :


0
votes

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é.


1 commentaires

Bon point, mais le fichier de session étant vide (plutôt que inexistant) me fait penser que ce n'est pas le problème dans ce cas.



0
votes

On dirait que le cookie de sessionID n'est pas défini


0 commentaires

1
votes
  • Je suggère d'utiliser

    error_rporting (e_all);

    dans le début de chaque fichier

  • 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.


2 commentaires

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 () 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é."



1
votes

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.


1 commentaires

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.



3
votes

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)

Ce que vous voulez vraiment faire, c'est

$ sessid = session_start (); // pour le début d'une nouvelle session et

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 ()

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)

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é.

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 problèmes.

---------- [EDIT

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. ; -)


3 commentaires

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é!



4
votes

1 commentaires

Après avoir lu les documents, je pensais que cela le ferait, mais cela ne semblait pas changer quoi que ce soit.



2
votes

coup long mais mérite de mentionner:
PHP est-il configuré correctement pour gérer des sessions?
Quelle est la sortie phpinfo ()?


0 commentaires

0
votes

Regardez vos paramètres PHP.ini. En particulier, vous souhaitez définir session.auto_start sur 0 si vous faites manuellement session_start () . Et si vous comptez sur la session Cookie ou la réécriture de l'URL transparente, vous aurez besoin de session.use_cookies = 1 et / ou session.use_trans_sid = 1 aussi.


1 commentaires

session.auto_start est à 0. session.Utilise_cookies est à 1 et session.trans_sid = 0



11
votes

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 ^^) .

.

. Tous, quelques questions:
(ils comptent au moins si aucune de ces suggestions ne fait l'affaire)

  • Quelle version de php / apache utilisez-vous?
  • Êtes-vous sur Windows? Linux?
  • Si vous êtes sur votre serveur "Production", quel service d'hébergement utilisez-vous? Peut-être qu'il y a quelque chose de spécial à ce sujet?
  • est le problème présent pour chacun ?
    • Y a-t-il toujours un problème lorsque vous naviguez sur le site?
    • est-il toujours présent lorsque vous accédez au site d'un autre navigateur?
    • Qu'en est-il d'un autre ordinateur?
    • Si vous utilisez quelque chose comme var_dump ($ _ session); Die; à la fin du script qui définit les données en session, que donne-t-il?


      première idée: Et si vous définissez une tête pour désactiver la mise en cache par le navigateur?
      trucs comme ceci, par exemple: xxx


      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?


      Troisième idée:

      • Vous avez dit error_rporting est défini sur e_all , qui est gentil
      • Qu'en est-il de display_errors ? Est-il défini sur sur de sorte que les erreurs soient affichées?
      • Y a-t-il quelque chose d'intéressant dans PHP / Apache's ERROR_LOG ?


        Un autre: êtes-vous sûr qu'il n'y a absolument rien qui accède à la sortie avant le session_start ? Pas même des espaces blancs?


        Encore un autre: êtes-vous sûr des autorisations sur les répertoires / fichiers?

        • La permission d'écrire dans un répertoire signifie que vous pouvez créer de nouveaux fichiers et / ou supprimer des anciens.
          • Mais, si je me souviens bien, non pas que vous pouvez les modifier
          • Pour modifier des fichiers, vous avez besoin d'un accès en écriture sur les fichiers.
            • En fait, votre serveur Web a besoin d'un accès en écriture à ces fichiers ^^

              Quelles sont les autorisations sur le répertoire de la session et sur les fichiers (vides) qui sont créés?


              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!

              Bien chance!


2 commentaires

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?



1
votes

Je dois être d'accord avec ce que Jason a dit plus tôt. Il suffit d'ajouter le session_start (); 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.

modifier votre code comme celui-ci xxx

suivi du reste de votre code ...

J'espère que cela résout le problème.


2 commentaires

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.



1
votes

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.


1 commentaires

Très bon point, j'ai déjà eu ce problème, mais ce n'est pas le problème cette fois = /



9
votes

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;
}


0 commentaires

1
votes

J'ai testé le code et j'ai même répliqué les paramètres INI que vous avez.

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).

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.


0 commentaires

0
votes

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> 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>

  • aller à http: //: /session_test.php dans un navigateur p> li>

  • Que se passe-t-il si vous actualisez la page? (A.K.A: Vos sessions fonctionnent-elles maintenant?) Li> ul>

    Cela s'assurera que le problème est dans la combinaison PHP / Apache | IIS et non dans tous les autres code. P> P>


0 commentaires

0
votes

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!

http://net.tutsplus.com/videos/screencasts/how-to-build-a-login-system-for-a-simple-website/

Cela peut ne pas répondre à votre problème de session, mais résoudre le sujet de manière presque égale; d


0 commentaires

0
votes

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 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.

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ù.


0 commentaires

0
votes

J'avais le même problème. Ma solution était un peu différente du reste ici. Dans mon fichier php.ini , j'ai eu ce paramètre register_globals = on .

Et dans mon code, disons que j'ai eu une session _ _ "utilisateur] et ultérieurement dans mon code attribué quelque chose à $ utilisateur remplaçait mon < Code> $ _ Session ['utilisateur'] Informations avec tout ce que j'avais affecté à $ utilisateur .

donc assurez-vous que register_globals est désactivé ou modifiez vos noms de variable. = D


0 commentaires

0
votes

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.


0 commentaires