IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Rendre objet global


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 77
    Par défaut
    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).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    Par défaut
    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!

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 77
    Par défaut
    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...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    	}
    }
     
    ?>

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 77
    Par défaut
    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

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    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é.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] La methode range de l'objet global à échoué macro dans un userform
    Par diude54 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/02/2013, 11h38
  2. La méthode Range de l'objet global a échoué
    Par cline01 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/08/2010, 21h58
  3. objet "globalement" utilisable
    Par alphascorpii dans le forum Général Python
    Réponses: 12
    Dernier message: 16/05/2010, 17h25
  4. [C#] Objet "Globale"
    Par repié dans le forum Windows Forms
    Réponses: 11
    Dernier message: 27/10/2006, 12h07
  5. Rendre super-globale une variable
    Par thanaos dans le forum Langage
    Réponses: 13
    Dernier message: 09/06/2006, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo