Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je galère sur ce problème depuis quelques jours et j'en vois pas le bout.
J'essaye de stocker dans la session un objet de type Zend_Db_Select :
// select sur un vue d'une table dans MySQL ... $select = $this->_db->select() ->from($this->_name);
J'ai tester avec et sans serialize ...
1) Si j'exécute ce code :
// session par défaut créée dans le bootstrap $session = Zend_Registry::get('session'); try { $session->select = $select; } catch ( Exception $e ) { die($e->getMessage()); } // affichage du "select" qui est supposé être dans la session die($session->select);
je me prend ça dans les dents à l'exécution :
// affichage comme il faut du select ... Fatal error: Exception thrown without a stack frame in Unknown on line 0
Ensuite, sous IE 6, le reste de l'application tourne normalement. Par contre, sous Firefox 2, rien ne va plus, toute l'appli est plantée en donnant ça (quelque soit le code que je fais tourné ... le bootstrap qui utiliser l'auth qui fait planter) :
Fatal error: Uncaught exception 'PDOException' with message 'You cannot serialize or unserialize PDO instances' in D:\wamp\www\site\web\library\Zend\Session.php:404 Stack trace: #0 [internal function]: PDO->__wakeup() #1 D:\wamp\www\site\web\library\Zend\Session.php(404): session_start() #2 D:\wamp\www\site\web\library\Zend\Session\Namespace.php(116): Zend_Session::start(true) #3 D:\wamp\www\site\web\library\Zend\Auth\Storage\Session.php(87): Zend_Session_Namespace->__construct('auth') #4 D:\wamp\www\site\web\index.php(136): Zend_Auth_Storage_Session->__construct('auth') #5 {main} thrown in D:\wamp\www\site\web\library\Zend\Session.php on line 404 Fatal error: Exception thrown without a stack frame in Unknown on line 0
La ligne 404 de session.php correspond à "session_start()" ... surement une blague des développeurs de mettre un si importante fonction sur la ligne 404 !!!
Bref, Le seul moyen de pouvoir de nouveau utiliser FF2 est de le fermer et de le rouvrir ...
2) Si j'exécute ce code :
// session par défaut créée dans le bootstrap $session = Zend_Registry::get('session'); try { $session->select = serialize($select); } catch ( Exception $e ) { die($e->getMessage()); } // echo du "select" qui est supposé être dans la session die($session->select);
je me prend ça dans les dents :
You cannot serialize or unserialize PDO instances // pas de select ... il passe pas par le "die($session->select)" // => normal il a exécuté le catch ...
Je suis dans la mouise ... je pourrais toujours stocker dans la session mon select sous forme de String, mais que je le récupèrerai, je perdrai les avantages que me procure l'objet Zend_Db_Select ( ajout de where, order, etc ... )
Donc s'il y a une solution efficace qui marche, je suis preneur
Merci d'avance.
PS : désolé pour la taille du message, mais je préfère tout bien décrire dès le début que de rajouter 10 fois des précisions ... même si je suis pas contre préciser encore plus s'il le faut
Hors ligne
Hello,
Pas possible en l'état.
Tu dois implanter une méthode __sleep (qui est appelée par serialize) qui stocke ce qui est nécessaire et une méthode __wakeup() qui reconstruit ton select.
Quel est ton réel besoin ?
A+
Hors ligne
NE jamais utiliser DIE
C'est déjà un point pourquoi veux tu faire un DIE alors que l'exception va arrêter le script
Le try capture les erreur et le catch permet de ne pas planter le script s'il y a eut erreur et toi tu mets un die dedans pour le replanter
enlève ton try catch et l'erreur serra affichée.
La registry n'est pas la session je ne sais pas ce que tu fais avec ça mais Zend_Session est suffisant pour récupérer la session et la manipuler
ensuite pourquoi mettre un select dans la session ??? pourquoi ne pas y mettre simplement les info qui permettent de le construire. c'est beacoup plus léger et tu n'as pas de mécanique complexe à mettre en oeuvre.
mettre un objet de ce type en session signifie que tu devras systématiquement charger avant l'ouverture de la session (c'est à dire avant le démarage de ZF ) toutes les classes nécéssaire soit toutes les classe de la conexion du select du rowset etc.
il est beaucoup plus simple de garder les paramètre de la requête et le résultat s'il y en a un.
du coup lorsque tu en as besoin et uniquement à ce moment là tu reconstruit ton select ou manipule le résultat.
A+JYT
Hors ligne
mikaelkael a écrit:
Hello,
Pas possible en l'état.
Tu dois implanter une méthode __sleep (qui est appelée par serialize) qui stocke ce qui est nécessaire et une méthode __wakeup() qui reconstruit ton select.
Quel est ton réel besoin ?
A+
Mon besoin, c'est de garder un select en session pour un affichage paramétrable ( trier sur les attributs, passer de page en page car 10 résultats seulement à la fois ... ).
En fait j'ai un formulaire qui me permet de choisir les condition de la recherche, je construit mon select grâce aux infos et je redirige vers une action de liste des infos. Cette action récupèrera le select en session et affichera les données qui vont bien en fonction des paramètres passé en GET ( order, limit 2,10, etc ... )
J'ai plusieurs formulaires de recherche qui sont redirigés vers cette action de listing ...
Si je dois redéfinir __sleep() et __wakeup(), je le fais où ? dans sleep je ferai quoi ? fermer l'accès à la bd et dans wakeup le rouvrir ?
sekaijin a écrit:
NE jamais utiliser DIE
C'est déjà un point pourquoi veux tu faire un DIE alors que l'exception va arrêter le script
Le try capture les erreur et le catch permet de ne pas planter le script s'il y a eut erreur et toi tu mets un die dedans pour le replanter
enlève ton try catch et l'erreur serra affichée.
La registry n'est pas la session je ne sais pas ce que tu fais avec ça mais Zend_Session est suffisant pour récupérer la session et la manipuler
ensuite pourquoi mettre un select dans la session ??? pourquoi ne pas y mettre simplement les info qui permettent de le construire. c'est beacoup plus léger et tu n'as pas de mécanique complexe à mettre en oeuvre.
mettre un objet de ce type en session signifie que tu devras systématiquement charger avant l'ouverture de la session (c'est à dire avant le démarage de ZF ) toutes les classes nécéssaire soit toutes les classe de la conexion du select du rowset etc.
il est beaucoup plus simple de garder les paramètre de la requête et le résultat s'il y en a un.
du coup lorsque tu en as besoin et uniquement à ce moment là tu reconstruit ton select ou manipule le résultat.
A+JYT
Je fais des die() de partout pour le debuggage ... en plus des Zend_Debug::dump() pour les variables complexes ( objets, tableaux, etc ... ).
J'ai fait des tests, le code du catch est exécuté et il continue à exécuter le code qui suit ... c'est pour ça que je met des die() pour savoir quel code est exécuté ...
J'utilise le registre pour récupérer ma session : dans le boostrap j'initialise le namepace de session et je le met dans le registre, partout ou j'en ai besoin je le récupère, ça permet d'accéder au même namespace.
Je voudrai mettre le Zend_Db_Select dans la session pour pouvoir profiter de ses avantage quand je le récupère. Sinon, je peux toujours mettre le select comme une string, mais après je vais devoir concaténer les "order", les "limit" et du coup je vais devoir réinventer la roue
Je peux pas mettre les infos de mon select en session parce qu'il y en a énormément ...
J'ai déjà lu sur le web pendant mes recherche qu'il fallait "systématiquement charger avant l'ouverture de la session toutes les classes nécessaire" ... or j'utilise l'autoload
est-ce que le fait de mettre des "include_once()" avant l'ouverture de mon namespace de session serait ma solution ?
Dernière modification par Jocio (24-07-2008 08:08:14)
Hors ligne
Hello,
Dans ce cas, cela s'appelle Zend_Paginator et ça vient de sortir en 1.6RC1.
A+
Hors ligne
J'ai regardé vite fait Zend_Paginator. Ça a l'air bien sympa ...
Le problème, c'est que d'après ce que j'ai compris, il sert générer une interface pour changer de page et j'ai déjà un système qui marche bien pour ça.
Ce que je voudrai moi, c'est pouvoir executer la requête exécutée précédemment en lui changeant l'order ou le limit ... donc je crois pas que ce nouveau composant puisse m'aider pour ça
Peux-tu m'en dire plus sur la redéfinition de __sleep et __wakeup ?
Je sens que c'est ce que je cherche désespérément pour mon problème.
Je ne vois pas ou je dois les redéfinir et surtout comment je dois les redéfinir
Hors ligne
__sleep et __wakeup : http://fr.php.net/manual/fr/language.oo … ctions.php
Pour un cas concret, voir la source de Zend_Db_Table_Row_Abstract.
Hors ligne
Finalement j'ai changer ma façon de faire pour simplifier le problème.
Je stocke en session le tableau des "id" et je reconstruit le sélect ...
Ça répond pas à l'interrogation que j'avais de mettre un Zend_Db_Select en session mais maintenant ce que je voulais faire est fait et ça marche ...
Merci beaucoup pour votre aide, je pense que pas mal de solution au problème sont dans les réponses que vous avez écrite mais j'ai la flemme de les essayer.
Dernière modification par Jocio (28-07-2008 22:04:20)
Hors ligne