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
    Membre régulier
    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
    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 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    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 confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 657
    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
    Membre régulier
    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
    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 693
    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 693
    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
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 657
    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
    Membre régulier
    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
    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 confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 657
    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
    Membre régulier
    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
    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
    Membre régulier
    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
    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