Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme capricieux de : Call to a member function on a non-object

12 réponses
Avatar
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

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

10 réponses

1 2
Avatar
Bruno Desthuilliers
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.

Avatar
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+


Avatar
Pascal PONCET
- 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

Avatar
ownowl
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+

Avatar
Bruno Baguette
pour info et si ca peut aider, je place :
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 -

Avatar
Gromitt
On 24 avr, 15:14, ownowl wrote:
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.

Avatar
ownowl

pour info et si ca peut aider, je place :
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


Avatar
ownowl
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.


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+

Avatar
Fredchou
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


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:

Avatar
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
1 2