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 :

erreur "incomplete object" !


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 76
    Points : 72
    Points
    72
    Par défaut erreur "incomplete object" !
    Bonjour à tous,

    J'ai un petit soucis pour récupérer un objet sur la session dans le cadre d'une connexion par login mot de passe, je tourne en rond depuis un moment d'où ce post.

    Je vous explique :
    Si l'utilisateur est bien identifié au moment du post du formulaire, alors je sauvegarde mon objet user correctement instancié sur la session :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // instanciation de l'objet user en amont en affectant toutes ses
    // propriétés avec les valeurs trouvées dans la bdd
     
    $_SESSION["user"] = $user;
    ensuite, au retour sur ma page d'accueil, dans l'espace réservé à l'affichage du login du user connecté s'il y en a un, je fais :
    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
     
    <?PHP
    if( isset( $_SESSION["user"] ) )
    {
    $user_connected = (object)$_SESSION["user"];
    ?>
    <table width="100%">
      <tr>
        <td>connecté <?php echo $user_connected->login; ?></td>
      </tr>
      <tr>
        <td><a href="/public/divers/logout.php">deconnexion</a></td>
      </tr>
    </table>
    <?PHP
    }
    else
    {
      // on affiche ici le formulaire de connexion
    }
    php me retourne alors le message suivant :

    Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition <b>user</b> of the object you are trying to operate on was loaded _before_

    comme si l'objet n'était pas bien instancié ! Remarquez que je passe bien par un cast (object).

    Quelqu'un a-t'il une idée ?

    Par avance merci et... bonne année à tous

  2. #2
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    Tu fais bien un session_start() sur chaque page ?
    Pas de questions techniques par MP, le forum est là pour ça et est plus efficace.

    Orthographe : une connexion (avec un x), un langage (sans u), une requête (un seul t), 'une quote' (avec qu), une syntaxe (sans h)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 76
    Points : 72
    Points
    72
    Par défaut résolu
    C'est bon, j'ai trouvé la solution au pb. Cela semblera peut-être trivial pour certains, dans ce cas je m'en excuse, mais je ne suis pas encore un développeur php aguerri .

    Quelques explications, peut-être que cela servira.

    Il faut tout simplement veiller à bien inclure la définition de la classe de l'objet avant le démarrage de la session. Comme je fonctionne le plus souvent par include, je n'avais pas remarqué que mon inclusion de classe se faisait après le démarrage de la session, du coup php ne peut connaitre la structure de cet objet sauvegardé !

    Code incorrect :
    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
     
    // dans la page principale
    session_start();
     
    // ce qui suit est dans un fichier d'include
    include $_SERVER["DOCUMENT_ROOT"] . 'monpackage/User.php';
     
    if( isset( $_SESSION["user"] ) )
    {
    $user_connected = $_SESSION["user"];
    ?>
    <table width="100%">
      <tr>
        <td>connecté <?php echo $user_connected->login; ?></td>
      </tr>
      <tr>
        <td><a href="/public/divers/logout.php">deconnexion</a></td>
      </tr>
    </table>
    <?PHP
    }
    déclenche l'erreur The script tried to execute a method or access a property of an incomplete object

    Code correct :
    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
     
    // dans la page principale
    include $_SERVER["DOCUMENT_ROOT"] . 'monpackage/User.php';
    session_start();
     
    // ce qui suit est dans un fichier d'include
    if( isset( $_SESSION["user"] ) )
    {
    $user_connected = $_SESSION["user"];
    ?>
    <table width="100%">
      <tr>
        <td>connecté <?php echo $user_connected->login; ?></td>
      </tr>
      <tr>
        <td><a href="/public/divers/logout.php">deconnexion</a></td>
      </tr>
    </table>
    <?PHP
    }
    comme ça, lors de la récupération de l'objet user sur la session, php connait sa structure

    Je m'interdis maintenant les session_start dans mes fichiers include, et pour ne pas me tromper, je préfixe à présent tous ces fichiers par inc_ même si ces derniers sont dans des répertoires bien identifiés sous /include.

    Dorénavant, les session_start sont faits dans les pages principales, avant la balise <html>, cela m'évitera de plus les messages d'erreur comme quoi le header a déjà été envoyé ou bien encore des doublons de session_start.

    Voilà, j'espère ne pas avoir écrit trop d'inepsies et j'espère aussi que mes mésaventures profiteront à d'autres.

    Très bonne fin de week-end à tous

    -David-

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 76
    Points : 72
    Points
    72
    Par défaut
    Bonjour JWhite,

    Merci pour ta réponse, le pb était bien en relation avec le session_start, je le faisais mais pas dans le bon ordre comme expliqué dans mon précédent post.

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

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