Précédent   Forum des professionnels en informatique > PHP > Langage > Formulaires
Formulaires Forum d'entraide sur les formulaires avec PHP. Avant de poster -> FAQ formulaires, Cours de formulaires et Sources de formulaires
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 13/01/2007, 22h01   #1
Membre du Club
 
Inscription : octobre 2002
Messages : 76
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 76
Points : 55
Points : 55
Envoyer un message via MSN à cpr0
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 :
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 :
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
cpr0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2007, 11h53   #2
Expert Confirmé

 
Avatar de Amara
 
Inscription : juillet 2004
Messages : 2 684
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : juillet 2004
Messages : 2 684
Points : 2 910
Points : 2 910
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)
Amara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2007, 12h14   #3
Membre du Club
 
Inscription : octobre 2002
Messages : 76
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 76
Points : 55
Points : 55
Envoyer un message via MSN à cpr0
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 :
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 :
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-
cpr0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2007, 12h16   #4
Membre du Club
 
Inscription : octobre 2002
Messages : 76
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 76
Points : 55
Points : 55
Envoyer un message via MSN à cpr0
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.
cpr0 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 19h38.


 
 
 
 
Partenaires

Hébergement Web