passage des objets par session

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : passage des objets par session

par nabs » 24 avr. 2006, 17:23

encore une petite correction :
la méthode __sleep doir renvoyer un tableau, tout comme le décri jeff dans le post précedent (avec le nom des propriétés entre "" ou '').

par nabs » 24 avr. 2006, 16:55

tinkiete mon pote, j'ai trouvé chaussure a mon pied.

le lien suivant donne une exlication de ces fonctions, ou devrais je dire méthode ! en faite il faut les surcharger de sorte à ce qu'elles soient appelées automatiquement lors de la serialisation (ou linearisation).
le lien est le suivant :

http://php.mirrors.ilisys.com.au/manual ... .magic.php

par précaution je rajoute le code qui est donné en exemple, dans le cas ou le lien meurt :
class Connection {
   protected $link;
   private $server, $username, $password, $db;

   public function __construct($server, $username, $password, $db)
   {
       $this->server = $server;
       $this->username = $username;
       $this->password = $password;
       $this->db = $db;
       $this->connect();
   }

   private function connect()
   {
       $this->link = mysql_connect($this->server, $this->username, $this->password);
       mysql_select_db($this->db, $this->link);
   }

   public function __sleep()
   {
       mysql_close($this->link);
   }

   public function __wakeup()
   {
       $this->connect();
   }
}
la surcharge n'a rien de compliké. c cool.

en tt k merci pour ton aide jeff.

par jeff » 24 avr. 2006, 16:41

bon

en fait tu ne peut utiliser un objet dont tu ne connais pas la structure, le session_start recree ton objet, c'est pour ca que tu a besoin d'appeler le fichier de definition avant le session_start

pour sleep si mais souvenir sont bon
class objet{
public $param1;
public $param2;
private $bdd;

public function __sleep(){
return array('param1','param2');
}

public function __wakeup(){
$this->param1 = 'param1';
$this->param2 = 'param2';

$this->dbb = mysql_connect();
}
je suis pas du tout sur de l'implementation de __sleep et __wakeup, je ne les utilises quasiment jamais
si ton objet a besoin d'une connexion a une db tu la reinitialise avec la methode __wakeup

en effet ces deux fonction sont tres mal documenter :?

par nabs » 24 avr. 2006, 16:26

ah non ! j'accepte pas la ! tu me donne pas les explications avec précision je suis pas d'accord la !!!! lol.
c cool mon pote !!!!!! ca marche nikel. merci bcp. c2la bombe amigo !!!!!!
merci encore.
mais au faite, une derniere question. j'ai un objet qui établi une connexion à une bdd, de ce que j'ai compri la linéarisation est un moyen un peu trop brutal pour ce genre d'objet, et j'ai essayé de me documenté sur les _sleep et _wakeup mais c trop vague j'y comprend pas grand chose. dans le cas ou la connexion serait coupée par la linéarisation, peux tu me faire part de tes connaissances concernant ces deux fonctions stp. merci

par jeff » 24 avr. 2006, 15:28

heu pardon j'ai pas été assez precis l'inclusion doit se faire avant la declaration de la session

par nabs » 24 avr. 2006, 15:17

ca me fait la meme chose. j'ai inclu la classe qui se trouve dans le fichier class.php par cette ligne :
require("class.php");
ensuite j'ai saisi la ligne comme noté :
echo "bonjour ".$nom." ".$prenom." ".$_SESSION["user"]->getnom(); 
j'ai obtenu le meme résultat. ensuite j'ai essayé par cette ligne :
echo "bonjour ".$nom." ".$prenom." ".$_SESSION["user"]->nom;
et la j'obtiens ceci :
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition <b>utilisateur</b> of the object you are trying to operate on was loaded _before_ the session was started in e:\program files\easyphp1-8\www\professionnalisation\accueil.admin.php on line 8
la ligne 8 étant la ligne décrite plus haut.
merci de vos réponses.

par jeff » 24 avr. 2006, 12:24

salut
avant d'utiliser ton objet il faut appeller la class
require 'user.class.php';
echo "bonjour ".$nom." ".$prenom." ".$_SESSION["user"]->getnom();

par nabs » 24 avr. 2006, 10:02

yo jeff,
j'ai essayé ske tu ma donné mais ca marche pas. en faite ca me donne l'erreur suivante :

Code : Tout sélectionner

Fatal error: Unknown(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition <b>utilisateur</b> of the object you are trying to operate on was loaded _before_ the session was started in e:\program files\easyphp1-8\www\professionnalisation\accueil.admin.php on line 7
la ligne 7 contient ceci :
  echo "bonjour ".$nom." ".$prenom." ".$_SESSION["user"]->getnom();
user est un objet que j'ai tenté de faire passer comme dans l'exmple que tu as donné. si tu as un élément de réponse ou autre je suis preneur. et si klkun voi ce que c que le pb, merci de bien vouloir m'aider la dessus.

par nabs » 21 avr. 2006, 17:26

si ca prend plus de ressources qu'une session simple avec qlq parametres de base, dans ce cas c pas tré interessant de faire passer l'objet en lui meme. par contre, j'ai pas compri le coup du _sleep et du _wakeup(). jeff pourrai tu m'expliker un peu mieux stp ces fonctions. ou encore, comme on dit un schéma vaut mieux qu'un long discours, alors un exemple serai la bienvenue.
merci les gars.

par Ryle » 21 avr. 2006, 17:24

A mon sens, c'est une erreur de developpement de passer des objets en session
Pas nécessairement non, il suffit de les utiliser intelligement et avec parcimonie :)

J'ai un site sur lequel les utilisateurs s'authentifient pour poster des contributions. Sur chaque page, j'ai besoin de connaitre leur id, pseudo, droits, et pas mal d'autres informations. Donc pas vraiment envie d'interroger la base à chaque page pour récuperer toujours les mêmes valeurs.

Je pourrais bien sur mettre les valeurs en session dans des variables, mais l'avantage de l'objet est que je profite également de toutes les méthodes : en cas de modification de l'objet, j'appel un update et l'enregistrement en base se fait automatiquement, pas besoin de reprendre mes valeurs et de ré-écrire un update.
De même, lorsque je set un attribut, tous les contrôles (format, taille, etc.) sont fait automatiquement, ce qui simplifie grandement mon code.

C'est le seul objet que je passe en session (pour le reste je me contente également juste d'un identifiant) mais je garantie que j'apprécie de l'avoir celui là :) Je ne pense donc pas que ce soit une erreur, faut juste pas vouloir tout passer en session et se demander si ca vaut vraiment la peine :)

par jeff » 21 avr. 2006, 17:16

salut

session_start();
require Obj.class.php;
$obj = new Obj();
$_SESSION['obj'] = $obj;
normalement php serialize l'objet tous seul
require Obj.class.php;
session_start()
$_SESSION['obj'] ->mamethod();
__sleep et __wakeup de permettent de choisir les données à mettre en session

par zeus » 21 avr. 2006, 17:08

Si tu crée une méthode d'initialisation simple, je ne suis pas sûr que ça soit moins performant

Imagine comment tu vas combler ton serveur avec la taille des sessions qui vont découler de tes serialisation ...

par nabs » 21 avr. 2006, 16:53

je suis bien d'accord avec toi, mais dans ce cas je vois pas trop l'interet de l'objet car la session joue bien ce role (a part pour les methodes mais qu'on peut remplacer par de simples fonctions). en + il faudra a chaque fois passer par une étape d'initialisation de l'objet nouvellement créé. ne serait-ce pas plus "judicieux" de passer l'objet et de l'utiliser directement avec les methodes et les parametres qu'il possede ?

par nabs » 21 avr. 2006, 16:47

merci de repondre a mes question zeus, j'ai vu que tu as répondu a ma question sur les deux sujets. j'ai réecri sur le 2nd car je l'avais pas vu tout a lheure et comme ca traite de la meme choz, donc j'ai remonté le sujet, il est plus complet l'ancien. mais en repondant a l'un on répond aux deux.

par zeus » 21 avr. 2006, 16:46

D'où sortent les données que tu mets dans ton objet ?

Si c'est d'une base de données, ton tuple doit bien avoir un identifiant ? c'est de celui-ci dont je te parle... ;)

Ensuite, si c'est des données que tu récupères d'un formulaire par exemple, il te faut les enregistrer avant de changer de page

etc ...

A mon sens, c'est une erreur de developpement de passer des objets en session