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 24/12/2007, 01h14   #1
Membre du Club
 
Inscription : janvier 2005
Messages : 141
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 141
Points : 58
Points : 58
Envoyer un message via MSN à joujoukinder
Par défaut Rendre objet global

Bonjour,

Voilà, je suis nouveau en PHP et je me retrouve confronté à un problème:

J'ai 2 objets que je voudrais rendre globaux à l'application, c'est à dire que je voudrais les instancier une fois lors de la demande de "index.php", et ensuite pouvoir les utiliser.

Mon application est très simple, elle a 3 menus qui lorsqu'on clique dessus rechargent "index.php" en lui passant des paramètres dans l'URL afin d'en déterminer le contenu.

Seulement voilà: Quand la page index.php se recharge, mes objets globaux se réinitialisent aussi! Du coup je perd toutes les infos que j'avais stockées...

Un objet global sert pour la connection à la base de données, et l'autre à la gestion de l'utilisateur loggué.

Voici le code simplifié:

index.php

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
 
 
<?php 
 
// Initialisations
include("Init/initIncludesPaths.php") ; // Initialisation des includes
include("Init/initObjects.php") ; // Initialisation des objets --> code qui pose problème
 
?>
 
<!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>
 
<title>Un titre</title>
 
</head>
<body>
 
<div id='page_wrapper'>
  <div id='page_header'>
    <?php include("InterfaceGraphique/Template/page_header.php")?>
  </div>
  <div id='menu_bar'>
    <div id='navcontainer'>
      <ul id='navlist'>
   	<?php include("InterfaceGraphique/Template/navlist.php")?>
      </ul>
    </div>
  </div>
  <div id='content_wrapper'>
    <div id='left_side'>
     	<?php include("InterfaceGraphique/Template/left_side.php")?>
    </div>
    <div id='right_side'>
    	<?php include("InterfaceGraphique/Template/right_side.php")?>
    </div>
    <div id='center'>
    	<?php include("InterfaceGraphique/Template/center.php")?>           
    </div>
  </div>
  <div id='page_footer'>
  		<?php include("InterfaceGraphique/Template/page_footer.php")?>  
  </div>
</div>
</body>
</html>
Le code qui pose problème se trouve dans "initObjects.php". En effet, a chaque fois que la page est chargée, bien que j'ai mis les objets dans des variables globales, ceux-ci sont toujours inexistants lors du chargement....

initObjects.php

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
 
 
<?php
 
// Initialisation de la BD si l'utilisateur n'y est pas connecté
initDatabase();
 
// Initialisation de la session si l'utilisateur n'est pas loggué
initSessionDefaults();
 
// Initialisation de l'objet utilisateur
initUser() ;
 
// Initialisation de l'objet utilisateur
function initUser()
{
 
if(!isset($GLOBALS['user'])) 
	{
		// Problème, passe toujours ici à chaque chargement 
		// de index.php!
		$GLOBALS['user']= new user() ; 
	}
 
	//Si on est en train de logguer
	$page = params::getParamFromURL('page', 'POST') ;
 
	if(isset($page))
	{
		// Essayer de logguer l'utilisateur
		$login = params::getParamFromURL('login', 'POST') ;
		$pass = params::getParamFromURL('pass', 'POST') ; 
 
		if(isset($login) && isset($pass))
		{
			$GLOBALS['user']->checkLogin($login, $pass, false) ;
 
			if($GLOBALS['user']->failed == true)
			{
			   navigation::gotoLogin();
			}
			else
			{
				navigation::gotoAcceuil();
			}
		}
	}
 
}
// Fonction qui initalise la connection à la base de données
function initDatabase()
{
	// Problème, passe toujours ici à chaque chargement 
		// de index.php!
	if(!isset($GLOBALS['adressesBD']))
	{
		$GLOBALS['adressesBD']= new adressesBD() ; 
 
		// On se connecte de suite à la base
		$GLOBALS['adressesBD']->connect();
	}
}
 
// Fonction qui initilalise l'objet de session
function initSessionDefaults()
{
	if (!isset($_SESSION['uid']) )
	{
		$_SESSION['logged'] = false;
		$_SESSION['uid'] = 0;
		$_SESSION['username'] = '';
		$_SESSION['cookie'] = 0;
		$_SESSION['remember'] = false;
	}
}
 
?>
Du coup, je n'arrive pas à naiguer dans le site, car l'utilisateur se réinitialise à chaque appel de index.php, m'obligeant à me relogguer.

Et-ce que je fais quelque-chose de faux?

Merci pour votre aide!
joujoukinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2007, 01h42   #2
Membre régulier
 
Inscription : novembre 2003
Messages : 77
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : novembre 2003
Messages : 77
Points : 83
Points : 83
Bonjour,

Utiliser $GLOBALS[] comme variable ne permet que détendre la portée de cette variable dans le script. Mais comme pour toutes variables sa durée de vie est limité à la durée d'exécution du script.

Pour conserver vos objets (ceux-ci doivent être serializable si je ne m'abuse) d'une page à l'autre vous devez utiliser les variables de sessions $_SESSION[].

Cependant, je ne sais pas trop ce que vous voulez faire exactement, mais sauvegarder une connexion ainsi est à évité selon moi (et je ne crois pas que se sera possible).
sim_mmm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2007, 01h48   #3
Membre du Club
 
Inscription : janvier 2005
Messages : 141
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 141
Points : 58
Points : 58
Envoyer un message via MSN à joujoukinder
Merci pour cette réponse rapide!

Je ne connaissais pas cette info de la portée des variables au script.

Je pense donc que dans mon cas, il faut que j'utilise la $_SESSION afin de sauvegarder les informations de mon utilisateur.

L'objet de gestion de la base de données sera réinitialisé à chaque fois (avec un new()). Je voulais éviter cela, mais visiblement je n'ai pas le choix...

Je vais essayer cela demain.

Merci encore!
joujoukinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2007, 01h51   #4
Membre régulier
 
Inscription : novembre 2003
Messages : 77
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : novembre 2003
Messages : 77
Points : 83
Points : 83
Citation:
Envoyé par joujoukinder Voir le message
L'objet de gestion de la base de données sera réinitialisé à chaque fois (avec un new()). Je voulais éviter cela, mais visiblement je n'ai pas le choix...
re-Bonjour,

Vous pouvez toujours essayer (je n'es jamais testé) cela pourrait marcher...

D'autres pourront sûrement vous faire des suggestions...
sim_mmm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2007, 02h46   #5
Membre du Club
 
Inscription : janvier 2005
Messages : 141
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 141
Points : 58
Points : 58
Envoyer un message via MSN à joujoukinder
Encore moi...

Cette fois j'ai le même problème, mais avec la session. Mes variables ne sont pas gardées par la session, de la même façon que tout à l'heure, lorsque index.php est rechargée...

Je ne comprend pas... Pourtant je les affecte et le code passe dans l'affectation. Mais quand je recharge la page, tout ce qui est dans la session disparaît...

initObjects.php

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
 
 
<?php
 
// Initialisation de la BD si l'utilisateur n'y est pas connecté
initDatabase();
 
// Initialisation de l'objet utilisateur
initUser() ;
 
// Initialisation de l'objet utilisateur
function initUser()
{
	// Si l'utilisateur n'est pas loggué
 
// PROBLEME LORS DU RECHARGEMENT, LA VARIABLE logged NE RESTE PAS
 
	if(!isset($_SESSION['logged'])) 
	{
		$_SESSION['logged'] = false ; 
	}
 
	if($_SESSION['logged'] == true)
		debug::trace("Session loggued true");
	else
		debug::trace("Session loggued false");
 
	if($_SESSION['logged'] == false)
	{
		//Si on est en train de logguer
		$page = params::getParamFromURL('page', 'GET') ;
 
		if(isset($page))
		{
			if($page == "DBLogin")
			{
				// Essayer de logguer l'utilisateur
				$login = params::getParamFromURL('login', 'GET') ;
				$pass = params::getParamFromURL('pass', 'GET') ;
 
				if(isset($login) && isset($pass))
				{
					$us = new user();
 
					$us->checkLogin($login, $pass, false) ;
 
					if($us->failed == true)
					{
			   			navigation::gotoLogin() ;
					}
					else
					{
						$_SESSION['uid'] = 150 ;
						$_SESSION['username'] = htmlspecialchars($login);
						//$_SESSION['cookie'] = $user->Cookie;
						$_SESSION['logged'] = true;
 
						navigation::gotoAcceuil();
					}
				}
			}
		}
	}
}
// Fonction qui initalise la connection à la base de données
function initDatabase()
{
	if(!isset($GLOBALS['adressesBD']))
	{
		$GLOBALS['adressesBD']= new adressesBD() ;
 
		// On se connecte de suite à la base
		$GLOBALS['adressesBD']->connect();
	}
}
 
?>
joujoukinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2007, 02h53   #6
Membre régulier
 
Inscription : novembre 2003
Messages : 77
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : novembre 2003
Messages : 77
Points : 83
Points : 83
Bonjour,

Je ne suis pas un spécialiste des sessions mais je crois que vous devez faire au début de votre script un session_start();

référence : http://ca3.php.net/function.session-start
sim_mmm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2007, 03h26   #7
Membre du Club
 
Inscription : janvier 2005
Messages : 141
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 141
Points : 58
Points : 58
Envoyer un message via MSN à joujoukinder
En effet, c'était bien cela!

Merci beaucoup!

Je vais à l'encontre de beaucoup de problèmes si je commence comme cela...
joujoukinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2007, 09h26   #8
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par sim_mmm
Pour conserver vos objets (ceux-ci doivent être serializable si je ne m'abuse) d'une page à l'autre vous devez utiliser les variables de sessions $_SESSION[].
Exact : les ressources, votre connexion à la base en est une, ne sont pas (directement du moins) sérialisables. Vous devez vous y prendre autrement.

Je disais directement car il est possible de recréer une ressource à partir de ses paramètres en jouant sur les méthodes magiques __sleep et __wakeup. Mais dans le cas d'une base de données ce n'est donc pas vraiment adapté.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2007, 10h05   #9
Membre du Club
 
Inscription : janvier 2005
Messages : 141
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 141
Points : 58
Points : 58
Envoyer un message via MSN à joujoukinder
Pour l'heure, cela fonctionne bien ainsi.

La connection est toujours instanciée à chaque chargement de la page web, mais cela ne me pose pas vraiment de problème. Le plus important était l'objet de session. Je vais à présent implémenter les fonctionnalités et je verrai bien si je dois modifier quelque-chose.

Merci.
joujoukinder est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h45.


 
 
 
 
Partenaires

Hébergement Web