web-dev-qa-db-fra.com

Les sessions ne fonctionnent pas dans localhost mais fonctionnent dans le serveur actif (Codeigniter)

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

 Database Screenshot

Quelqu'un peut-il signaler l'erreur? Toute aide serait appréciée.

12
Shanil Soni

Votre question comporte plusieurs parties, je vais répondre à chacune d’elles à tour de rôle. 

En ce qui concerne la récupération des valeurs de la session

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'];

Concernant les 4 enregistrements de session dans la base de données

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.

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

Selon les docs :

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/';
5
Don't Panic
$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;

$ config ['sess_regenerate_destroy'] = FALSE;

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

0
Sagar Tank

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 producesabove $result devrait être comme ça 

$result = array(
    'user'  => 'Ab',
    .....
    'logged_in' => TRUE
);

Comment accéder à la clé de session

echo $this->session->userdata('user');

ou

$user = $this->session->userdata('user');
echo $user;
0
Abdulla Nilam

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'];
0
Kiran Suthar

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.

0
Shanil Soni