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 :

Mystère avec erreur inconnue en php, depuis que je fais du OO [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 41
    Points : 31
    Points
    31
    Par défaut Mystère avec erreur inconnue en php, depuis que je fais du OO
    Bonjour,

    Je suis tout nouveau dans la cours du phpOO...

    Je commence juste à m'y mettre et je suis en train de développez une petite applic pour moi, pour me faire les griffe(cela dit cette applic me tient suffisament à coeur pour que cette erreur me fasse grincer des dents...).

    PHP Fatal error: Exception thrown without a stack frame in Unknown on line 0

    J'ai déjà googler ça plusieurs fois et j'ai trouvé quelques réponses. On dit que c'est parce que j'ai une gestion des exception perso, et que dans cette gestion, j'appelle justement une fonction qui en lance une... et que php arrête l'applic pour éviter une boucle infinie...

    Seul problème me concernant. je n'ai encore jamais lancé d'exception dans mon applic, ni utilisé de bloc try catch... (je suis à mes débuts, et c'est ma prochaine étape). donc je n'ai certainement pas monté un système de gestion perso des exceptions....

    Mon code est très simple. Il instancie une classe Page. Puis appelle une méthode startSession (qui n'a que comme seul but de lancer un start_session() ) à partir de cet objet.

    Puis je unset mon objet Page et vérifie ma var $_SESSION['userSession']. Si il existe une session, on va passer directement à écrire les pages protégées, en instanciant des classes éritants de Page (comme PageArticle, PageFichier ou PageMembres). Sinon, on instancie une classe PageLogin, qui permet de 1, d'afficher un formulaire de connexion et 2, de verifier la présence du potentiel membre à initier la session, et de poser un message. C'est pendant ce message que je vois l'erreur.

    Voici le code:

    $dbh = new PDO(DSN1, USER1, PASS1) ;


    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
     
    //PARTIE 1
    //---------
    //INITIER LA PAGE
    $Page = new Page($dbh) ;
    $Page->startSession();
    $Page->normalisation();
     
    unset($Page);
     
     
    //PARTIE 2
    //----------
    //Commencer la page
    if(!isset($_SESSION['session']) || empty($_SESSION['session']))
    {
    	//PARTIE 2.a
            //----------
    	$Page = new PageLogin($dbh) ;
    	$Page->definirAttrForm('?', 'formConnexion', 'formConnexion', '', 'connecter') ;
     
    	if(isset($_POST['connecter']) && isset($_POST['username']) && isset($_POST['password']))
    	{
     
    		echo $Page->recevoirFormConnexion(htmlentities($_POST['username']), htmlentities($_POST['password'])) ;
     
    	}
    	else
    	{
    		echo $Page->afficherFormConnexion();
    	}
     
    }
    else
    {
           //PARTIE 2.b
           //----------
     
    	if(isset($_GET['section']))
    		$section = $_GET['section'] ;
    	else
    		$section = 'documents' ;
     
    	if($section == 'documents')
    	{
    		$Page = new PageArticles($dbh) ;
    		echo $Page -> retournerHtmlHtml() ;	
    	}
    	else if($section == 'fichiers')
    	{
    		$Page = new PageFichiers($dbh) ;
    		echo $Page -> retournerHtmlHtml() ;
    	}
    }
    La méthode $Page->setSession() ressemble simplement à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function setSession()
    {
      start_session();
    }
    L'erreur se produit dans ce contexte: Je montre ma page depuis mon localhost (tout va bien). Je rentre mon login mot de passe. Le message me dit que je me suis bien connecté. Me propose de continuer et en bas de la page, l'erreur apparait. Si je click sur Continuer, je retourne au formulaire, et aucune session n a été créée.

    Si je passe le start_session() en commentaire dans ma classe PageLogin (ou si je passe en commentaire le $Page->startSession() dans la partie 1 de mon code principal), l'erreur s'en va. Evidemment ça ne m'arrange pas, puisque j'ai tout de même besoin de ma session.

    Ce qui me fait croire que c'est lié avec le start_session().... (mais tout avait bien marché pendant des lustres)...

    Ce qui est incroyable maintenant, c est que si je laisse les code de session tel quel, mais que je passe toute la partie 2 en commentaire, l'erreur ne semble pas apparaitre...

    Ce qui me fait croire que l'erreur est bien associée au start_session, mais qu'elle est déclenchée lorsque dans ma classe PageLogin, je récupère les identifiants et les passe en superglobale SESSION...


    Voilà, j'ai expliqué du mieux que je pouvais, et je suis toujours autant perdu...

    Merci à ceux qui ont une idée!

    Bonne soirée!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 320
    Points : 311
    Points
    311
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function setSession()
    {
      start_session();
    }
    Dyslexique ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    public function setSession()
    {
      session_start();
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Heu... oui

    j'avais la flemme de faire un copier coller pour autant peu de code...

    mon code contient bien "session_start()"...

    mais ce type aurait été une parse error et n'aurait pas lancé d'exception...

    Merci quand même

  4. #4
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Salut,

    Ce qui me fait croire que c'est lié avec le start_session().... (mais tout avait bien marché pendant des lustres)...
    1) As tu encore les droits d'écritures à l'emplacement où est enregistrée la session ?
    2) N'essaies tu pas d'enregistrer en session (directement ou indirectement) un objet PDO
    3) Peux tu éviter de faire 2 session_start() dans la même page (1 dans ton objet Page et 1 dans ton objet PageLogin - si j'ai bien compris)


    ERE

  5. #5
    Membre actif Avatar de tim974
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 175
    Points : 222
    Points
    222
    Par défaut
    Hum .. je crois que le start_session() doit se faire avant l'instanciation de l'objet non?

  6. #6
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut Pas particluièrement
    @fredu:
    je crois que le start_session() doit se faire avant l'instanciation de l'objet non?
    session_start() et pas start_session()

    Et non, par particulièrement. Le souci que tu soulèves est lié à la désérialization des objets: le code des class associées doit être connu de PHP avant de l'exécuter. Donc si un objet a été ssérialisé en session, il faut effectivement inclure les class (ou autoload) avant d'appeler le session_start()


    ERE

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    oooh merci pour ces réponses decidément tres complètes sur ce forum...


    @tim974
    Il me semble que la seule restriction avec un session_start est qu'il doit etre invoqué dans le header de la page... donc avant le html du document. Enfin, si c est à cela que tu te réfèrais...

    @emmanuel.remy

    1) As tu encore les droits d'écritures à l'emplacement où est enregistrée la session ?
    Je ne savais meme pas qu'on pouvait avoir des droits d écriture la dessus. Te réfères tu aux fichiers cookies qui contiennent ma session? Mon problème survient en local. Je ne crois pas non plus avoir modifié quoi que ce soit à mes droits sur ce type de fichiers. Et le système fonctionnait très bien avant...

    Par contre, j'ai à peu près en meme temps rencontré un problème bizarre sur mon ftp. Je ne peux plus rien faire sur l'un de mes dossier (et ses récursifs), à la racine. Je voudrais le supprimer, mais filezilla me dit que l'opération est denied. J'essaie de modifier ses droits à 0777 (ils sont à 0755) mais ca aussi, denied. Etrangement, le ftp me montre des images dans ce dossier et quand j'essaie de les ouvrir en php en indiquant l'emplacement en brut, il me dit que le fichier n'a pas été trouvé. Un affichage html dans un bloc img me montre une image cassée.... Un rapport peut etre...?

    N'essaies tu pas d'enregistrer en session (directement ou indirectement) un objet PDO
    Absolument!!!

    En fait, ma classe PageLogin cree un objet Session, heritant de User après avoir recueilli les infos pseudo et mdp du form de connexion. Directement, PageLogin appelle ensuite la fonction $Session->setSession(). Ce qu il se passe dedans c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function setSession()
    {
      $_SESSION['session'] = $this;
    }
    la classe Session possède egalement une propriete objet PDO... et pas de sleep/wakeup

    c'est mal?

    Mais encore une fois, le système marchait bien il y a encore 24 heures, sans que je touche à ma classe Session, User, ou PageLogin!

    Peux tu éviter de faire 2 session_start() dans la même page (1 dans ton objet Page et 1 dans ton objet PageLogin - si j'ai bien compris)
    Non session_start() n'est appelé qu'une seule fois. Elle est dans une methode publique de la super classe Page qui n'est pas appelee par le constructeur. Ainsi, j'appelle $Page->startSession() (qui appelle le session_start() natif de php) seulement manuellement depuis mon script principal... et une seule fois... Les autres instances de Page ou classes derivee n'appelle jamais startSession().



    Et non, par particulièrement. Le souci que tu soulèves est lié à la désérialization des objets: le code des class associées doit être connu de PHP avant de l'exécuter. Donc si un objet a été ssérialisé en session, il faut effectivement inclure les class (ou autoload) avant d'appeler le session_start()
    Ca je ne suis pas sur d'avoir compris. A chaque fois qu'une page est affichee, elle l'est a travers d'un script sur index.php... (je fonctionne avec des sections passees en GET et mon script principal ne tourne donc que sur une seule page). Dans cet index.php, j'inclu systematiquement toutes les classes au debut... donc...

    Par contre, je ne suis pas sur de serializer quoique ce soit....


    En tout cas merci pour les pistes... je continue mes recherches!!!

  8. #8
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Salut,
    peux tu changer de noms de variable pour l'objet de la classe Page et faire le unset en dernier lieu ?

  9. #9
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    la classe Session possède egalement une propriete objet PDO... et pas de sleep/wakeup

    c'est mal?
    J'ai eu le cas par le passé d'une erreur similaire quand on essayait de sérializer un objet contenant une référence à un objet PDO. Mais si cela fonctionnait avant, on peut peut-être mettre cette hypothèse de côté.

    As tu encore les droits d'écritures à l'emplacement où est enregistrée la session ?
    La session est enregistrée par défaut sur le disque de ton server. Donc si tu n'as plus les droits d'écriture, c'est typiquement l'erreur que tu obtiendras. Un différentiel peut être effectué avec un test local si tu es certain que PHP a les droits en local pour cette écriture.

    Par contre, je ne suis pas sur de serializer quoique ce soit....
    Chaque écriture dans une variable de session se traduira par une sérialization de la donnée.


    @thes32:
    +1 pour déplacer cette ligne, ou la supprimer, tout simplement.

    ERE

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    J'ai commencé l'oo il y a quelques temps seulement, et déjà ça a révolutionner ma manière de coder, mais je dois dire que je ne suis pas toujours "au taquet" sur cette logique...

    peux tu changer de noms de variable pour l'objet de la classe Page et faire le unset en dernier lieu ?
    Je ne suis pas sur de voir ce que tu dis alors j'ai essayé ceci:

    (à la place de la ligne ou il y a le unset)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $NewPage = $Page;
     
    unset($Page);
    ce qui ne change rien, et ça m'est logique, puisque je ne fais que créer une nouvelle référence à $Page...

    J'ai aussi essayé de virer le unset($Page) conformément à vos conseils, et ça ne change rien non plus. C'est juste que c'est dans ma logique de vouloir supprimer cet objet de la mémoire, puisque je vais de toutes façon en construire un autre, plus complet...

    Je pense qu'il aurait été plus logique de ne pas appeler mes fonctions de session et de normalisation (magic_quotes_gpc) à travers d'un objet Page dans la partie 1 du code entier... Je crois d'ailleurs que je vais changer cela pour rester avec la partie 2 seulement.

    J'ai eu le cas par le passé d'une erreur similaire quand on essayait de sérializer un objet contenant une référence à un objet PDO. Mais si cela fonctionnait avant, on peut peut-être mettre cette hypothèse de côté.
    Effectivement... Je me suis rendu compte qu'en réalité, mes objets Sessions stockaient un objet PDO alors qu'il n'en avaient pas du tout besoin. C'était en fait pour prévoir le coup, pour certaines méthodes à ajouter (par exemple, pour la gestion des membres, qui manque encore à mon applic).

    J'ai donc effacé toute référence à PDO dans ma classe Session et User... et miracle, tout est redevenu comme avant...

    Si je dois implémenter une gestion des utilisateurs, mon plan est de spécialiser ma classe User en AdminUser, ou RegularUser (classes soeurs de Session) à qui cette fois ci, je passerai mon objet PDO, que ces dernière nécessiteront... Au moins je contourne le problème de session, puisque les objets issus de ces classes ne seront jamais référés par $_SESSION...

    pas très propre mais bon...

    La session est enregistrée par défaut sur le disque de ton server. Donc si tu n'as plus les droits d'écriture, c'est typiquement l'erreur que tu obtiendras. Un différentiel peut être effectué avec un test local si tu es certain que PHP a les droits en local pour cette écriture.
    Hum oui... Je ne suis pas beaucoup familiarisé avec ces histoires de droits sur mes sessions, mais je vais faire un peu de googleage et on verra bien ce que je trouve...

    J'imagine que comme mon problème est maintenant résolu, ça veut dire que php a conservé ses droits.

    @thes32:
    +1 pour déplacer cette ligne, ou la supprimer, tout simplement.
    Pourquoi ne pas déclarer mes fonctions d'initiaition (startSession et normalisation) de la partie 1 dans mon bout de code complet dans mon sujet en static.

    Ainsi, dans ma partie 1, je pourrai simplement faire
    Page::fonction()... (si je me souviens bien)...

    En tout cas merci de votre aide... au moins le problème est réglé...

    Est ce que je met le topic sur résolu? Il ne l'est pas vraiment...

  11. #11
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    salut,

    ton erreur n'est plus un mystère tu sais de quoi il s'agit maintenant. si t'as un nouveau problème = autre topic.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/09/2008, 01h44
  2. Réponses: 5
    Dernier message: 23/06/2008, 21h08
  3. Réponses: 1
    Dernier message: 25/09/2007, 09h18
  4. [Forum] Des erreurs avec tous les scripts PHP
    Par sensoo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 25/04/2006, 18h41
  5. Réponses: 6
    Dernier message: 23/05/2005, 08h33

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