Je suis confronté à ce problème depuis hier et pourtant je ne pouvais pas le résoudre. Le problème est que les sessions ne fonctionnent pas dans un environnement local, mais lorsque, dans un but de test, je mets les mêmes fichiers sur un serveur actif, ils fonctionnent correctement.
Ici si mon fichier config.php:
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
$config['cookie_prefix'] = '';
$config['cookie_domain'] = '';
$config['cookie_path'] = '/';
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
Voici comment enregistrer les données dans l'un de mes fichiers de modèle
$this->session->set_userdata('user',$result); //$result works fine, it produces
right result
À mon avis, j'ai essayé d'y accéder en:
$this->session->userdata['user']['name']; //name here is an element in result array
Je reçois cette erreur:
Gravité: avis
Message: index non défini: utilisateur
Nom de fichier: home/home.php
Numéro de ligne: 2
À ma grande surprise, ce même code s'exécute sans erreur sur le serveur.
Aussi, pour pouvoir connaître les données sauvegardées par les sessions Codeigniter, j'ai essayé la méthode de la base de données.
J'ai changé le code ci-dessous dans le fichier config.php
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_sessions';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
Au lieu d'insérer une ligne de données, il en insère quatre. Veuillez voir ci-dessous la capture d'écran de la base de données (quatre dernières lignes).
Quelqu'un peut-il signaler l'erreur? Toute aide serait appréciée.
Votre question comporte plusieurs parties, je vais répondre à chacune d’elles à tour de rôle.
userdata()
est une méthode. La façon dont vous y accédez le traite comme un tableau:
$this->session->userdata['user']['name']; // Bad
Comme décrit dans la documentation , vous devez transmettre la clé de la valeur que vous voulez récupérer en tant que paramètre à la méthode userdata
:
$user = $this->session->userdata('user');
// Now you can echo $user['name'];
Encore plus simple, utilisez la syntaxe la plus récente:
$user = $this->session->user;
// Now you can echo $user['name'];
Vérifiez les champs timestamp
. Ils affichent 3 heures différentes, ce qui signifie qu'il s'agit de 3 événements distincts sur le site. Le premier se produit à 1501911275
, puis 6 secondes plus tard, il y a 2 autres enregistrements, puis 139 secondes plus tard, le dernier enregistrement. Celles-ci représentent 3 demandes distinctes sur le site - probablement que vous visitiez différentes pages, que vous testiez et rechargiez.
Quant à pourquoi, il y a plusieurs enregistrements, c'est parce que l'ID de session est régénéré périodiquement. Cela dépend de votre configuration. Voir l’option sess_time_to_update
config. La fréquence à laquelle ils sont détruits dépend également de votre configuration (voir sess_regenerate_destroy
dans la même section de la documentation). Toutefois, les enregistrements de session les plus anciens restent en mémoire pendant un certain temps et sont nettoyés ultérieurement par le nettoyage de la mémoire. Ainsi, alors que vous ne possédez qu'un seul enregistrement de session "en cours", les anciens enregistrements peuvent durer un certain temps.
sess_save_path
D'après le libellé de votre question, je pense que vous souhaitez utiliser le pilote de session files
et que vous n'avez essayé que le pilote database
pour le tester. Si cela est correct, il existe un problème de configuration de session de fichiers que vous devez résoudre.
seuls les chemins absolus sont supportés pour $ config ['sess_save_path'].
Les commentaires dans config/config.php
disent aussi:
ATTENTION: Seuls les chemins absolus sont supportés!
Votre configuration spécifie que les données de session doivent être enregistrées dans ci_sessions
, qui n'est pas un chemin absolu:
$config['sess_save_path'] = 'ci_sessions'; // Bad
Je ne sais pas comment sera interprété, mais je suppose que le répertoire n'existera pas et que le serveur Web ne sera pas autorisé à le créer. Je ne peux pas imaginer pourquoi cela fonctionne sur votre serveur live.
Modifiez le chemin en un chemin absolu et assurez-vous que votre serveur Web peut y écrire. Encore de la docs
mkdir /<path to your application directory>/sessions/
chmod 0700 /<path to your application directory>/sessions/
chown www-data /<path to your application directory>/sessions/
(remplacez www-data
par l'utilisateur sur lequel votre serveur Web est exécuté). Et alors:
$config['sess_save_path'] = '/<path to your application directory>/sessions/';
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
.htaccess
DirectoryIndex index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php?/$1 [
L, QSA]
Suivez ces
Dans config.php
Set $config['sess_save_path'] = NULL;
Comme vous l'avez dit$this->session->set_userdata('user',$result); //$result works fine, it produces
above $result
devrait être comme ça
$result = array(
'user' => 'Ab',
.....
'logged_in' => TRUE
);
echo $this->session->userdata('user');
ou
$user = $this->session->userdata('user');
echo $user;
Je pense que le problème avec l'accès aux données de session avec une syntaxe incorrecte.Vous pouvez utiliser la syntaxe ci-dessous pour définir des données de session et obtenir des données de session.
Exemple pour définir les données de session
$session_data = array('name' => "kiran");
$this->session->set_userdata('user', $session_data);
Exemple pour obtenir des données de session stockées
$this->session->userdata('user')['name'];
Il semble que le problème concerne la version 7.1 de PHP, car CI 3.1.6 ne prenait pas en charge cette version PHP.
Je ne suis pas sûr que ce soit l'explication correcte, mais lorsque je suis revenu à la version PHP 5.6, tout a commencé à fonctionner parfaitement.