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 :

Comment appeler les fonctions d'un objet enregistré dans $_SESSION


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Mars 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Comment appeler les fonctions d'un objet enregistré dans $_SESSION
    Bonjour,
    Suite à la mise en place de classe, je suis confronté à l'inaccessibilité à des données d'un objet d'une classe dans $_SESSION.

    Dans ma page Index.php, j'initialise ma variable comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $_SESSION['Utilisateur'] = new Utilisateur (getenv ("USERNAME"), $MyDB);
    Ma page Index.php est composée de plusieurs iframe, toutes en local sur le même serveur.
    Quand j'essaye d'accéder aux données de mon objet, j'obtiens un message d'erreur :

    ! ) Fatal error: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Utilisateur" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in C:\UwAmp\www\my-app\Dispatch\Modules\Bals.php on line 84
    Call Stack
    # Time Memory Function Location
    1 0.0007 369064 {main}( ) ...\Bals.php:0

    Ma ligne 84
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for ($Idx=1; $Idx <  $_SESSION['Utilisateur']->GetNbBals(); $Idx++)
    correspond à l'appel d'une fonction de l'objet qui retourne une valeur numérique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Public Function GetNbBals ()
    	{
    		return ($this->NbBals);
    	}
    Visiblement, ma façon d'appeler la fonction n'est pas la bonne mais je ne vois pas comment faire autrement.
    J'ai aussi regardé du côté des sessions avec les iframe mais quand je fais un print_r de $_SESSION, je vois bien les données enregistrées $_SESSION['Utilisateur'], un tableau de tableau

    D'avance merci pour vos lumières.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Bonjour,
    Il faut inclure la définition de la classe (si vous ne faites pas de l'autoload, sinon c'est un autre souci).

  3. #3
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 424
    Points : 15 794
    Points
    15 794
    Par défaut
    est ce que vous incluez bien la définition de la classe avant la lecture de la session avec "session_start" ?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Mars 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    J'ai lu des pages sur l'autoload mais je n'ai pas compris la différence/association avec le constructor et comment l'intégrer dans mon code.

    Sinon oui, le code de ma page chargée dans l'iframe commence bien par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?PHP
       session_start();
       require ('connect.php');
       require ('utilisateur.php');
    ?>
    avec connect.php qui ouvre la connexion à la base de données et utilisateur.php le chargement de ma classe utilisateur.

    Ce que je comprends de vos message est que le code $_SESSION['Utilisateur']->GetNbBals() est bien correctement écrit ?

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 243
    Points
    20 243
    Par défaut
    Il y'a plusieurs explications possibles :

    * Soit la classe n'est pas autoloadable
    * Soit sa définition n'est pas inclue avant le session_start() .


    => Dans ces deux cas à la désérialization PHP ne connais pas la classe et n'arrive donc pas à reconstruire l'objet

    * Soit la classe utilise des ressources qui ne sont pas nativement serialisables et il faut passer par les méthode magic __sleep et __wakeup pour l'aider

    --edit--

    Passe ton require avant le session_start

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 424
    Points : 15 794
    Points
    15 794
    Par défaut
    Citation Envoyé par mathieu Voir le message
    est ce que vous incluez bien la définition de la classe avant la lecture de la session avec "session_start" ?
    Citation Envoyé par PHPBeginer Voir le message
    Sinon oui, le code de ma page chargée dans l'iframe commence bien par
    vous me répondez "oui" mais le code que vous montrez dit "non" ;-)

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Mars 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par mathieu Voir le message
    est ce que vous incluez bien la définition de la classe avant la lecture de la session avec "session_start" ?
    Je viens de relire un peu mieux la réponse.
    Cela veut dire qu'il faudrait que je charge la classe avant l'ouverture de la session, même si j'utilise la variable plus loin ?

    et donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?PHP
       require ('utilisateur.php');
       session_start();
       require ('connect.php');
    ?>

  8. #8
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 424
    Points : 15 794
    Points
    15 794
    Par défaut
    c'est dans l'appel de "session_start" qu'il se passe (en résumé) le code $_SESSION['Utilisateur'] = new Utilisateur(données stockées dans le fichier de session) donc la classe doit exister à ce moment là.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Mars 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Ok merci, je vais tester ça.
    Et donc du coup, j'imagine qui si j'arrive à comprendre l'autoload (qui si j'ai bien ne doit plus être utilisé mais être remplacé par spl_autoload_register ?), cela compense ce genre de problème ?

    Merci

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Mars 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Au top, merci pour vos lumières

    Question subsidiaire et certainement bête mais comme je ne vois la réponse explicitée clairement nul part, si je passe sur une solution avec spl_autoload_register, faut il que l'appel de l'autoload se fasse aussi sur chacune des pages (avant session_start du coup ?) ou 1 seule fois au niveau de la page index pour déclaration ?

Discussions similaires

  1. Comment appeler une fonction qui renvoie une matrice dans une autre function
    Par laminedu63 dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 06/10/2017, 09h40
  2. Réponses: 3
    Dernier message: 15/04/2016, 20h09
  3. Réponses: 7
    Dernier message: 08/07/2014, 10h00
  4. Réponses: 7
    Dernier message: 13/01/2008, 16h52
  5. Réponses: 1
    Dernier message: 19/04/2007, 09h08

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