web-dev-qa-db-fra.com

PHP Les données de session ne sont pas enregistrées

J'ai une de ces situations "je jure que je n'ai pas touché le serveur". Honnêtement, je n'ai touché à aucun des scripts php. Le problème que j'ai est que les données php ne sont pas enregistrées sur différentes pages ou actualisations de page. Je sais qu'une nouvelle session est créée correctement car je peux définir une variable de session (par exemple $ _SESSION ['foo'] = "foo" et l'imprimer à nouveau sur la même page très bien. Mais quand j'essaie d'utiliser cette même variable sur une autre page, il n'est pas défini! Y a-t-il des fonctions php ou des informations que je peux utiliser sur mon serveur d'hôtes pour voir ce qui se passe?

Voici un exemple de script qui ne fonctionne pas sur le serveur de mes hôtes pour le moment:

<?php
session_start();
if(isset($_SESSION['views']))
    $_SESSION['views'] = $_SESSION['views']+ 1;
else
    $_SESSION['views'] = 1;

echo "views = ". $_SESSION['views'];
echo '<p><a href="page1.php">Refresh</a></p>';
?>

La variable 'views' n'est jamais incrémentée après avoir actualisé la page. Je pense que c'est un problème de leur côté, mais je voulais d'abord m'assurer que je ne suis pas complètement idiot.

Voici le phpinfo () pour le serveur de mes hôtes (PHP version 4.4.7): alt text

56
Crackerjack

Merci pour toutes les informations utiles. Il s'avère que mon hôte a changé de serveur et a commencé à utiliser un chemin de sauvegarde de session différent de/var/php_sessions qui n'existait plus. Une solution aurait été de déclarer ini_set(' session.save_path','SOME WRITABLE PATH'); dans tous mes fichiers de script mais cela aurait été pénible. J'ai parlé avec l'hôte et ils ont explicitement défini le chemin de la session sur un chemin réel qui existait. J'espère que cela aide toute personne ayant des problèmes de chemin de session.

41
Crackerjack

Vérifiez que vous ne mélangez pas https: // avec http: //. Les variables de session ne circulent pas entre les sessions sécurisées et non sécurisées.

13
paul

J'ai eu le même problème - ce qui m'est arrivé est que notre administrateur de serveur a changé le booléen session.cookie_secure en On, ce qui signifie que les cookies ne seront envoyés que via une connexion sécurisée. Comme le cookie n'était pas trouvé, php créait une nouvelle session à chaque fois, donc les variables de session n'étaient pas vues.

9
Shane N

Utilisez phpinfo() et vérifiez les paramètres session.*.

Peut-être que les informations sont stockées dans des cookies et que votre navigateur n'accepte pas les cookies, quelque chose comme ça.

Vérifiez d'abord et revenez avec les résultats.

Vous pouvez également faire une print_r($_SESSION); pour avoir un vidage de cette variable et voir le contenu ....

Concernant votre phpinfo(), le session.save_path Est-il valide? Votre serveur Web a-t-il un accès en écriture à ce répertoire?

J'espère que cela t'aides.

7
vIceBerg

J'ai eu le problème suivant

index.php

<?
    session_start();
    $_SESSION['a'] = 123;
    header('location:index2.php');
?>

index2.php

<?
  session_start();
  echo $_SESSION['a'];
?>

La variable $_SESSION['a'] n'a pas été défini correctement. Ensuite, j'ai changé le index.php en conséquence

<?
    session_start();
    $_SESSION['a'] = 123;
    session_write_close();
    header('location:index2.php');
?>

Je ne sais pas ce que cela signifie en interne, je m'explique simplement que le changement de variable de session n'a pas été assez rapide :)

6
harry

Vérifiez si le chemin d'enregistrement de la session est accessible en écriture par le serveur Web.

Assurez-vous que les cookies sont activés .. (J'oublie quand je les éteins pour tester quelque chose)

Utilisez firefox avec l'extension firebug pour voir si le cookie est défini et retransmis.

Et sur une note indépendante, commencez à regarder php5, car php 4.4.9 est le dernier de la série php4.

5
DGM

Vérifiez qui sont le groupe et le propriétaire du dossier dans lequel le script s'exécute. Si l'ID de groupe ou l'ID utilisateur sont incorrects, par exemple, définis sur root, les sessions ne seront pas enregistrées correctement.

3
buzzy blogger

Si vous définissez une session en php5, puis essayez de la lire sur une page php4, elle pourrait ne pas apparaître au bon endroit! Faites les pages la même version php ou définissez le chemin_session.

2
Harry

Je sais qu'une solution que j'ai trouvée (OSX avec Apache 1 et qui vient de passer à PHP5) quand j'ai eu un problème similaire était que la suppression d'une clé spécifique (c.-à-d. Unset ($ _ SESSION ['key']);) l'empêchait de sauvegarder. Dès que je n'ai plus effacé cette clé, elle a été enregistrée. Je n'ai jamais revu cela, sauf sur ce serveur sur un autre site, mais c'était une variable différente. Rien de spécial non plus.

Merci pour celui-ci Darryl. Cela m'a aidé. Je supprimais une variable de session, et pour une raison quelconque, elle empêchait la session de s’engager. maintenant je le mets juste à null à la place (ce qui est bien pour mon application), et cela fonctionne.

2
ndebellas

Vérifiez la valeur des "vues" avant de l'incrémenter. Si, pour une raison étrange, il est défini sur une chaîne, alors lorsque vous y ajoutez 1, il retournera toujours 1.

if (isset($_SESSION['views'])) {
    if (!is_numeric($_SESSION['views'])) {
        echo "CRAP!";
    }
    ++$_SESSION['views'];
} else {
    $_SESSION['views'] = 1;
}
2
nickf

Eh bien, nous pouvons éliminer l'erreur de code car j'ai testé le code sur mon propre serveur (PHP 5).

Voici ce qu'il faut vérifier:

  1. Appelez-vous session_unset () ou session_destroy () quelque part? Ces fonctions supprimeront immédiatement les données de session. Si je les mets à la fin de mon script, il commence à se comporter exactement comme vous le décrivez.

  2. Agit-il de la même manière dans tous les navigateurs? Si cela fonctionne sur un navigateur et pas sur un autre, vous pouvez avoir un problème de configuration sur le navigateur qui ne fonctionne pas (c'est-à-dire que vous avez désactivé les cookies et oublié de les activer, ou que vous bloquez les cookies par erreur).

  3. Le dossier de session est-il accessible en écriture? Vous ne pouvez pas tester cela avec is_writable (), vous devrez donc aller dans le dossier (de phpinfo () il ressemble à/var/php_sessions) et assurez-vous que les sessions sont réellement créées.

2
Nathan Strong

J'ai passé des années à chercher la réponse à un problème similaire. Ce n'était pas un problème avec le code ou la configuration, car un code très similaire fonctionnait parfaitement dans un autre .php sur le même serveur. Il s'est avéré que le problème était dû à une très grande quantité de données enregistrées dans la session sur cette page. À un endroit, nous avions une ligne comme celle-ci: $_SESSION['full_list'] = $full_list$full_list était un tableau de données chargé à partir de la base de données; chaque ligne était un tableau d'environ 150 éléments. Lorsque le code a été initialement écrit il y a quelques années, la base de données ne contenait qu'environ 1 000 lignes, donc le $full_list contenait environ 100 éléments, chacun étant un tableau d'environ 20 éléments. Avec le temps, les 20 éléments se sont transformés en 150 et 1000 lignes se sont transformées en 17000, donc le code stockait près de 64 mégaoctets de données dans la session. Apparemment, avec cette quantité de données stockées, il a refusé de stocker quoi que ce soit d'autre. Une fois que nous avons changé le code pour traiter les données localement sans les enregistrer dans la session, tout a parfaitement fonctionné.

2
Aleks G

Je voulais juste ajouter une petite note que cela peut également se produire si vous manquez accidentellement l'instruction session_start () sur vos pages.

1
Noccy

Un problème commun souvent négligé est également qu'il ne doit y avoir AUCUN autre code ou espacement supplémentaire avant la commande session_start ().

J'ai eu ce problème avant où j'avais une ligne vierge avant session_start () qui l'a empêchée de fonctionner correctement.

1
hyarion

J'ai eu ce problème lors de l'utilisation de pages sécurisées d'où je venais de www.domain.com/auth.php qui ont redirigé vers domain.com/destpage.php. J'ai supprimé le www du lien auth.php et cela a fonctionné. Cela m'a jeté parce que tout fonctionnait autrement; la session n'a pas été fixée quand je suis arrivée à destination.

1
Sean Anderson

Modifiez votre php.ini.
Je pense que la valeur de session.gc_probability est 1, alors mettez-la à 0.

session.gc_probability=0
1
emaniacs

Le chemin du cookie de session était défini sur "//" au lieu de "/". Firebug est génial. J'espère que ça aide quelqu'un.

1
Slawa

Voici un problème commun que je n'ai pas vu résolu dans les autres commentaires: votre hôte exécute-t-il une sorte de cache? S'ils mettent automatiquement en cache les résultats d'une manière ou d'une autre, vous obtiendrez ce type de comportement.

1
rg88

Ajout de ma solution:

Vérifiez si vous accédez au domaine correct. J'utilisais www.mysite.com pour démarrer la session et a essayé de la recevoir de mysite.com (sans le www).

J'ai résolu cela en ajoutant une réécriture htaccess de tous les domaines à www pour être sur le côté/site sûr.

Vérifiez également si vous utilisez http ou https.

1
Kai Noack

Je sais qu'une solution que j'ai trouvée (OSX avec Apache 1 et qui vient de passer à PHP5) quand j'ai eu un problème similaire était que la suppression d'une clé spécifique (c.-à-d. Unset ($ _ SESSION ['key']);) l'empêchait de sauvegarder. Dès que je n'ai plus effacé cette clé, elle a été enregistrée. Je n'ai jamais revu cela, sauf sur ce serveur sur un autre site, mais c'était une variable différente. Rien de spécial non plus.

1
Darryl Hein

Quelques autres choses que j'ai dû faire (j'ai eu le même problème: pas de rétention de session après PHP mise à niveau vers 5.4). Vous en avez beaucoup pas besoin, selon ce que contient le php.ini de votre serveur (vérifiez phpinfio ());

session.use_trans_sid=0 ; Do not add session id to URI (osc does this)
session.use_cookies=0;  ; ensure cookies are not used
session.use_only_cookies=0 ; ensure sessions are OK to use IMPORTANT
session.save_path=~/tmp/osc; ; Set to same as admin setting
session.auto_start = off; Tell PHP not to start sessions, osc code will do this

Fondamentalement, votre php.ini doit être défini sur aucun cookie et les paramètres de session doivent être conformes à ce que veut osc.

Vous devrez peut-être également modifier quelques extraits de code de session dans application_top.php - en créant des objets là où il n'en existe aucun dans les appels tep_session_is_registered (...) (par exemple, objet de navigation), définissez les variables $ HTTP_ sur les plus récentes $ _SERVER et un quelques autres tests isset pour les objets vides (google pour info). J'ai fini par pouvoir utiliser les fichiers sessions.php d'origine (inclut/classes et inclut/fonctions) avec un fichier application_top.php légèrement modifié pour remettre les choses en marche. Les paramètres php.ini étaient le principal problème, mais cela dépend bien sûr de ce que votre société de serveurs a installé par défaut.

0
Pete855217

Vérifiez si vous utilisez session_write_close (); n'importe où, j'utilisais cela juste après une autre session, puis j'essayais d'écrire à nouveau dans la session et cela ne fonctionnait pas.

0
Ani