PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 22-07-2010 10:13:32

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Les CLASSES+PDO et les SESSIONS

Bonjour,

Je post ici une information importante à mon sens concernant PDO, les Classes et les Sessions.


//Dans le cas où il serait stocké en variable de classe un objet PDO comme suit (simple exemple)
// fichier cl_userclasses.php
class maclasse {
     private $cnc;
     
     function __construct(){
         $db = new PDO($dsn_logs, $dblogs_user, $dblogs_pwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
          $this->cnc=$db;
         // ....
     }
     // ....
}

// et qu'ensuite vous enregistrez votre classe en variable de session comme suit:
$classe_user=NEW maclasse;
$_SESSION('control_obj')=$classe_user;

// Je pense qu'il est important de savoir que lors de la reconstruction de l'objet control_obj sur une nouvelle page comme suit

// Nouvelle page
 include("cl_userclasses.php");
session_start();
$my_session=session_id();

// on aura :

if (!isset($_SESSION('control_obj'))){die("vous n'êtes pas autorisé à visualiser cette page");} // qui sera vérifié.

// Pourquoi?

//Tout simplement parcequ'il y a sérialisation de la classe stockée dans la session à chaque déchargement de page et désérialisation et reconstruction à chaque nouvelle page de l'objet. Or PDO n'est pas sérialisable et par conséquent l'objet de nera pas reconstruit et on aura !isset($_SESSION('control_obj'))==true
 


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#2 29-07-2010 02:55:11

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : Les CLASSES+PDO et les SESSIONS

salut,

on pourra donc utiliser les méthodes magiques des classes de php5 __sleep() et __wakeup()

on clos la connection et sauvegarde de quoi reconnecter l'utilisateur (id) avec sleep et on fait l'inverse dans wakeup !

wink

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#3 29-07-2010 09:18:23

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Les CLASSES+PDO et les SESSIONS

Bonjour,

Tout à fait moogli. Mais il ne faut pas oublier que __sleep() et __wakeup() pouvaient déjà être implémenté dans une classe sans même utiliser PDO. Avec les nuances de gestion que PDO impose lors d'une sérialisation, cela oblige à faire quelques modifications par rapport à un code implémenté sans PDO. Par exemple, en reprenant le code ci-dessus


class maclasse{
 private $cnc;

  function __sleep(){
     $this->cnc=null; // sinon pas de sérialisation possible.
  }
  function __wakeup(){
    $db = new PDO($dsn_logs, $dblogs_user, $dblogs_pwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
    $this->cnc=$db;
 }

}
 

Dernière modification par Jc (09-08-2010 21:13:03)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#4 29-07-2010 16:23:18

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : Les CLASSES+PDO et les SESSIONS

c'est exactement à cela que je pensais

on clos la connection et sauvegarde de quoi reconnecter l'utilisateur (id) avec sleep et on fait l'inverse dans wakeup !

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

#5 09-08-2010 21:20:45

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Les CLASSES+PDO et les SESSIONS

Bonjour,

Alors pour ceux que ca interesse, vu que j'ai perdu pas mal de temps la dessus (PDO ne se laisse pas toujours apprivoiser facilement), le code ci-dessous

Jc a écrit :

function __wakeup(){
    $db = new PDO($dsn_logs, $dblogs_user, $dblogs_pwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
    $this->cnc=$db;
}

ne fonctionnera pas.. Vous allez me dire : est-il impossible d'instancier un objet PDO dans une fonction wakeup() ? Je vais répondre c'est possible à condition de faire comme cela :


 function __wakeup(){
    $this->cnc= new PDO($dsn_logs, $dblogs_user, $dblogs_pwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
 }
 

En effet, l'objet PDO n'autorise pas son instanciation dans la fonction __wakeup() par une variable locale à la fonction. A l'opposé de la fonction __construct() où seul le contraire est possible. Attention si l'on se trompe, aucune erreur est générée mais l'interpreteur PHP cesse d'interpreter donc difficile à debugger. Note: Je developpe sous PHP 5.2.13

Faudrait faire un topic sur PDO car je pense qu'il va y avoir matière...

PS : Pour d'autres objets cela fonctionne quelque soit la méthode utilisée.

Dernière modification par Jc (10-08-2010 06:43:09)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums