Vous n'êtes pas identifié(e).
Pages :: 1
Bonjour,
Je post ici une information importante à mon sens concernant PDO, les Classes et les Sessions.
// 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
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 !
@+
Il en faut peu pour être heureux pompompompompompompompompompompom
Hors ligne
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
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
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
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
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 :
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
Pages :: 1