Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/01/2011, 13h05   #1
Invité de passage
 
vincent courtois
Inscription : janvier 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : vincent courtois

Informations forums :
Inscription : janvier 2011
Messages : 2
Points : 0
Points : 0
Par défaut pourquoi ma session ne se conserve-t-elle pas entre les pages ?

Tout d'abord bonjour à toutes et à tous.

Voilà je tente actuellement d'améliorer mes compétences en PHP après un apprentissage universitaire plutôt disons ... Incomplet. Sur un ancien projet, j'étais parvenu à créer un mécanisme qui permettait à l'utilisateur de se connecter et qui conservait ses renseignements entre les pages, néanmoins pour le site que je suis en train de créer, ce même mécanisme ne marche pas, je me demande pourquoi.

L'architecture de mon site est plutôt simple et commune, en l'occurence pour ce qui nous intéresse ici l'enchainement des pages sera le suivant:

le visiteur est sur Vaccueil.php
en se connectant il appelle verifInscription.php
verifInscription.php est un controleur qui va appeler allUsers.php pour avoir la liste des membres, puis index.php.
index.php va appeler Vaccueil.php.

Vaccueil.php, comme toutes mes vues, inclue avant toute chose le fichier header.php qui comporte comme toutes première instruction ( avant même le doctype ) un session_start(), puisqu'il faut toujours le mettre en tout premier.

Le contexte est fixé, voyons maintenant le problème:

1. Si je ne mets pas de session_start() en tête de verifInscription.php : une catastrophe, aucune session n'est ouverte, aucune variable conservée, le mécanisme ne fonctionne pas une seconde.

2. Si je mets un session_start() en tête de verifInscription.php : c'est pas tellement mieux, il m'avertit que je tente de réouvrir une session déjà ouverte et quand je tente de réafficher Vaccueil.php, la session a miraculeusement disparu ... J'explique plus précisément :

Dans ce cas il me connecte correctement, le formulaire de connexion s'efface aau profit d'un echo du pseudo, jusque là tout va bien à part le warning de réouverture de session. Malheureusement quand je réaffiche la page d'accueil avec un print_r de $_SESSION, je me rend compte qu'il est vide et que le formulaire de connexion est revenu, misère !

en annexe, le code des fichiers cités ( racourci je vous rassure ) et le shéma du voyage entre les pages que j'ai expliqué, mais s'toujours plus explicite avec un shéma :

index.php
Code :
1
2
3
4
5
6
7
8
9
10
<?php	
    if(!isset($_GET['page'])) {
        $_GET['page'] = "";
    }
 
    switch($_GET['page']) {
        case "verifConnexion.php": require("./controleur/verifConnexion.php"); break;
        default: require("./controleur/accueil.php"); break;
    }
?>
header.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
    session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 
[...]
 
<div id = "formulaireConnexion">
    <?php
        if(isset($_SESSION['estConnecte'])) {
            if(!$_SESSION['estConnecte']) {
                include_once("./commun/includes/formulaireConnexion.php");
            }
            else {
                echo("vous ètes maintenant connecté en tant que " . $_SESSION['pseudo']);
            }
        }
    ?>
</div>
verifInscription.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
    session_start();
    include_once('./modele/allUsers.php');
 
[...]
 
    else {
        $_SESSION['pseudo'] = $pseudo;
        $_SESSION['pass'] = $pass;
        $_SESSION['estConnecte'] = true;
        if($verif['isAdmin'] != 0) {
            $_SESSION['isAdmin'] = true;
        }
        require_once('./vue/Vaccueil.php');
    }
Vaccueil.php
Code :
1
2
3
4
<?php
    include("./commun/includes/header.php");
    print_r($_SESSION);
?>
babausse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 13h44   #2
Membre chevronné
 
Homme Taoufiq Ben
Développeur Web
Inscription : mai 2009
Messages : 456
Détails du profil
Informations personnelles :
Nom : Homme Taoufiq Ben
Âge : 25
Localisation : Maroc

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2009
Messages : 456
Points : 639
Points : 639
Dans le verifInscription.php tu mets session_start(); puis tu appele le Vaccueill qui lui meme a une session_start(); dans lheader

Citation:
2. Si je mets un session_start() en tête de verifInscription.php : c'est pas tellement mieux, il m'avertit que je tente de réouvrir une session déjà ouverte et quand je tente de réafficher Vaccueil.php, la session a miraculeusement disparu ... J'explique plus précisément :
m4riachi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 14h30   #3
Membre actif
 
Inscription : décembre 2006
Messages : 184
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 184
Points : 198
Points : 198
d'ou l'intéret d'utiliser du poo avec le partern singleton

voici un exemple fait à l'arrache du coup on ne se souci plus si le session_start à été effectué dès qu'on récupère MySession ca le fait tout seul ou ca déjà été le cas et ceci une seule fois!
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
/**
 * @filesource exemple.php
 * @author xxxx
 * @version 1.0
 * Date 12 janv. 2011
 */
 
class MySession {
	private static $_instance = null;
 
	/**
	 * non instanciable
	 * utiliser MySession::getInstance()
	 */
	private function __construct(){
		$this->initialize();
	}
 
	private function initialize(){
		// demarre la session
		session_start();
		// initialise l'utilisateur
		if(!isset($_SESSION['user']['id']) || $_SESSION['user']['id']==0){
			$this->setUser(new User(0, 'Invité'));
		} else {
			// bon dans l'idéal faut passer par une table avec le session_id
			// et récupérer les données user via une requete sql
			$this->setUser(new User($_SESSION['user']['id'], $_SESSION['user']['name']));
		}
	}
 
	/**
	 * Retourne l'instance
	 * @return MySession
	 */
	public static function getInstance(){
		if(is_null(self::$_instance)){
			self::$_instance = new MySession();
		}
		return self::$_instance;
	}
 
	/**
	 * @param User $user
	 */
	public function setUser(User $user){
		$this->_user = $user;
		// au passage on stock les infos en session
		$_SESSION['user']['id']=$user->getId();
		$_SESSION['user']['name']=$user->getName();
	}
 
	/**
	 * Retourne l'utilisateur
	 * @return User
	 */
	public function getUser(){
		return $this->_user;
	}
 
	/**
	 * true si utilisateur reconnu
	 * @return boolean
	 */
	public function isConnected(){
		if($this->_user == null){
			return false;
		}
		if($this->_user->getId() == 0){
			return false;
		}
		return true;
	}
}
 
class User {
	private $_id = null;
	private $_name = null;
 
	/**
	 * @param integer $id
	 * @param string $name
	 */
	public function __construct($id, $name){
		$this->_id = $id;
		$this->_name = $name;
	}
 
	/**
	 * @return integer
	 */
	public function getId(){
		return $this->_id;
	}
 
	/**
	 * @param integer $id
	 */
	public function setId($id){
		$this->_id = $id;
	}
 
	/**
	 * @return string
	 */
	public function getName(){
		return $this->_id;
	}
 
	/**
	 * @param string $name
	 */
	public function setName($name){
		$this->_name = $name;
	}
}
 
// recuperation du user courant
$user = MySession::getInstance()->getUser();
 
// modification user
$user = new User(1234, 'toto');
MySession::getInstance()->setUser($user);
 
// pour savoir si l'utilisateur est connecté
if(MySession::getInstance()->isConnected()){
	// TODO
}
ps: tiens en faisant l'exemple je me dis que je vais peu être l'utiliser
Helfima est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 14h30   #4
Invité de passage
 
vincent courtois
Inscription : janvier 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : vincent courtois

Informations forums :
Inscription : janvier 2011
Messages : 2
Points : 0
Points : 0
Bonjour, et merci d'avoir daigné lire tout le gros pavé que j'ai imposé x]

Pour ce qui est du doublon de session_start() j'en suis conscient, mais quand je le retire la connexion ne se fait carrément plus et aucune session n'est ouverte, ni aucune variable de session enregistrée.

Je ne l'ai peut-être pas suffisamment explicité mais je cherche une solution pour que je puisse me connecter, que le site retienne mes variables de session et qu'il le propage entre toutes les pages afin que je puisse adapter mon contenu selon elle. Je pensais qu'en mettant un session_start() en haut de mon header, ça le mettrais en haut de chaque page et que donc ça fonctionnerait, néanmoins ça ne fonctionne pas ...

Merci pour l'aide éventuelle apportée

EDIT: je vais regarder la solution en POO, merci beaucoup =D je reviens très vite dire si ça a marché, ou pas ^^
babausse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 14h58   #5
Membre chevronné
 
Homme Taoufiq Ben
Développeur Web
Inscription : mai 2009
Messages : 456
Détails du profil
Informations personnelles :
Nom : Homme Taoufiq Ben
Âge : 25
Localisation : Maroc

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2009
Messages : 456
Points : 639
Points : 639
Redirige la page après le remplissage de la session.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<?php
    session_start();
    include_once('./modele/allUsers.php');
 
[...]
 
    else {
        $_SESSION['pseudo'] = $pseudo;
        $_SESSION['pass'] = $pass;
        $_SESSION['estConnecte'] = true;
        if($verif['isAdmin'] != 0) {
            $_SESSION['isAdmin'] = true;
        }
        header('location : ./vue/Vaccueil.php');
    }
m4riachi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 15h10   #6
Membre actif
 
Inscription : décembre 2006
Messages : 184
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 184
Points : 198
Points : 198
plop j'ai corrigé un peu mon code ci-dessus
je ne mémorisai pas les données en session
et j'initialisai pas le user dans le cas ou on avait fait un setUser()

j'ai aussi regardé mon code actuel
bon j'utilise que du poo mais dans l'idée
j'ai un contrôleur primaire en singleton qui initialise la session c'est le même principe que le code si dessus sauf que c'est pas au même niveau le session_start, bon après faut adapter
Helfima est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h04.


 
 
 
 
Partenaires

Hébergement Web