Discussion:
probleme capricieux de : Call to a member function on a non-object
(trop ancien pour répondre)
ownowl
2007-04-24 19:14:01 UTC
Permalink
bonjour à tous

J'ai une application qui communique par ajax avec son serveur, et une
des fonctionnalité de cette aplic est de se voir retourner par le
serveur un fichier .rtf construit à la volée.

Pour compléter le fichier rtf j'utilise des données d'un objet
sauvegardé dans la session utilisateur, et que lorsque je fait appel à
une méthode de cette object j'obtient : Call to a member function
mafonction() on a non-object in nomdufichier.php

ce qui me parrait trés bizare :

- si je fais un error_log($monobjet->malethode()), la valeur est
correcte dans le fichier log. (avec l'erreur sur le client)
- la page est chargée par un window.open(monUrl). Si je ne charge pas
dans une nouvelle fenêtre de navigateur, ca fonctionne.
- le problème apparait uniquement avec IE et pas avec Firefox

une idée ?
merci d'avance
Olivier
Bruno Desthuilliers
2007-04-25 07:50:34 UTC
Permalink
Post by ownowl
bonjour à tous
J'ai une application qui communique par ajax avec son serveur, et une
des fonctionnalité de cette aplic est de se voir retourner par le
serveur un fichier .rtf construit à la volée.
Pour compléter le fichier rtf j'utilise des données d'un objet
sauvegardé dans la session utilisateur, et que lorsque je fait appel à
une méthode de cette object j'obtient : Call to a member function
mafonction() on a non-object in nomdufichier.php
Je ne sais pas ce qu'il en est pour php5, mais pour php4, il faut
inclure la définition de la classe avant de désérialiser un objet, faute
de quoi l'interpréteur génère cette erreur.
ownowl
2007-04-25 10:06:53 UTC
Permalink
Post by Bruno Desthuilliers
Post by ownowl
Pour compléter le fichier rtf j'utilise des données d'un objet
sauvegardé dans la session utilisateur, et que lorsque je fait appel à
une méthode de cette object j'obtient : Call to a member function
mafonction() on a non-object in nomdufichier.php
Je ne sais pas ce qu'il en est pour php5, mais pour php4, il faut
inclure la définition de la classe avant de désérialiser un objet, faute
de quoi l'interpréteur génère cette erreur.
merci de ta réponse

effectivement, j'ai déjà rencontré ce problème, mais là ce n'est pas le
cas, la classe est bien inclue au préalable.
Et dans ce cas l'erreur serait la même quelque soit le navigateur
a+
Pascal PONCET
2007-04-25 14:08:02 UTC
Permalink
Post by ownowl
- le problème apparait uniquement avec IE et pas avec Firefox
Salut,
Si tu as une erreur PHP avec un client HTTP et pas avec l'autre, c'est
sûrement un problème de cache.
Je pense que tu es en phase de développement, avec PHP sur ton poste et
non pas sur un serveur distant, vrai ?
Pascal
ownowl
2007-04-25 22:04:36 UTC
Permalink
Post by Pascal PONCET
Si tu as une erreur PHP avec un client HTTP et pas avec l'autre, c'est
sûrement un problème de cache.
Je pense que tu es en phase de développement, avec PHP sur ton poste et
non pas sur un serveur distant, vrai ?
exact, mais je viens de faire des tests depuis un autre poste avec IE et
Firefox, c'est pareil.

pour info et si ca peut aider, je place :
header('Content-type: application/msword');
dans l'entête

merci et a+
Bruno Baguette
2007-04-26 08:14:49 UTC
Permalink
Post by ownowl
header('Content-type: application/msword');
dans l'entête
Est-ce que application/rtf ne serait pas plus indiqué, comme header ?

Pour info, je vois qu'il existe aussi text/rtf visiblement, mais je n'ai
pas creusé la différence entre les deux plus que ca.
--
Bruno Baguette - ***@alussinan.org
ownowl
2007-04-26 10:46:57 UTC
Permalink
Post by Bruno Baguette
Post by ownowl
header('Content-type: application/msword');
dans l'entête
Est-ce que application/rtf ne serait pas plus indiqué, comme header ?
Pour info, je vois qu'il existe aussi text/rtf visiblement, mais je n'ai
pas creusé la différence entre les deux plus que ca.
j'ai essayé les deux : application/rtf et txt/rtf et IE me retourne un
message modal :
Internet Explorer ne peut pas télécharger controler.php de localhost.
Internet explorer n'as pas pus ouvrir ce site internet. le site n'est
pas disponible...

par contre avec firefox ca fonctionne très bien
a+
Olivier
Gromitt
2007-04-26 08:14:49 UTC
Permalink
Post by ownowl
Pour compléter le fichier rtf j'utilise des données d'un objet
sauvegardé dans la session utilisateur, et que lorsque je fait appel à
une méthode de cette object j'obtient : Call to a member function
mafonction() on a non-object in nomdufichier.php
Cette erreur signifie que ta variable n'est pas un objet, mais autre
chose. Assure toi qu'il s'agit bien de l'objet attendu avant de faire
le moindre traitement :

$obj = $_SESSION['obj']; // exemple de generation d'objet

if (!is_object($obj) || is_a($obj, 'classe_attendue'))
{
// erreur
}

Il est possible que tu doives inclure le code de ta classe avant toute
autre manipulation; si tu ressors un objet sérialisé de ta session et
que sa définition n'est pas chargée, cela peut créer des situations
problématiques comme celle que tu viens de décrire.
ownowl
2007-04-26 10:46:57 UTC
Permalink
Post by Gromitt
Cette erreur signifie que ta variable n'est pas un objet, mais autre
chose. Assure toi qu'il s'agit bien de l'objet attendu avant de faire
$obj = $_SESSION['obj']; // exemple de generation d'objet
if (!is_object($obj) || is_a($obj, 'classe_attendue'))
{
// erreur
}
Il est possible que tu doives inclure le code de ta classe avant toute
autre manipulation; si tu ressors un objet sérialisé de ta session et
que sa définition n'est pas chargée, cela peut créer des situations
problématiques comme celle que tu viens de décrire.
La méthode passe très bien les tests que tu décrit au dessus. Et les
appels de méthode sur l'objet fonctionne aussi très bien, sauf qu'avec
IE on a des messages d'erreur.
a+
Fredchou
2007-05-01 12:54:15 UTC
Permalink
- si je fais un error_log($monobjet->malethode()), la valeur est correcte
dans le fichier log. (avec l'erreur sur le client)
- la page est chargée par un window.open(monUrl). Si je ne charge pas dans
une nouvelle fenêtre de navigateur, ca fonctionne.
- le problème apparait uniquement avec IE et pas avec Firefox
Je n'ai pas tout compris mais est-ce que ça ne viendrait pas d'un mauvais
passage de l'identifiant de session ? (par cookie ou paramètre GET)
--
Fredchou
mailto:***@nospam.free.fr.invalid
Yanick
2007-05-01 17:36:50 UTC
Permalink
Si tu utilise des Cookies, IE ne gère pas plus que 20 cookies à la
fois (ou un autre nombre arbitraire de la sorte). Sous FF, pas de
problème, mais sous IE, le 21e Cookie écrasera le permier (PHPSESSID)
se qui te fera perdre ta session. Si c'est le cas, alors je te suggère
de sérialiser tes cookies pour n'en faire qu'un seul... J'ai eu ce
genre de problème il y a peu de temps et ça l'a réglé.

-yanick
ownowl
2007-05-02 10:17:38 UTC
Permalink
Post by Yanick
Si tu utilise des Cookies, IE ne gère pas plus que 20 cookies à la
fois (ou un autre nombre arbitraire de la sorte). Sous FF, pas de
problème, mais sous IE, le 21e Cookie écrasera le permier (PHPSESSID)
se qui te fera perdre ta session. Si c'est le cas, alors je te suggère
de sérialiser tes cookies pour n'en faire qu'un seul... J'ai eu ce
genre de problème il y a peu de temps et ça l'a réglé.
-yanick
merci à toi et à Fredchou pour vos réponse. effectivement vos remarques
sont intéressantes, et corrobore (la notion d'identification de session)
la remarque de Chris Brown sur http://fr.php.net/session_start.
Du coup j'ai fais un test en ajoutant error_log('sid ' . session_id());
à mon fichier php, mais j'obtiens le même id que pour les autres appels .
a+
Olivier
ownowl
2007-05-09 23:24:42 UTC
Permalink
en fait ca fonctionne également avec ie si on rajoute la
ligne suivante dans le header de la reponse :

header("Cache-Control: max-age=0");

merci à tous pour votre aide
a+
Olivier

Continuer la lecture sur narkive:
Loading...