Il faut savoir que les ressources (références) de type connexion à une base de données ne peuvent pas être enregistrées dans une session.
L'objet que tu sérialise dans la session ne mémorie donc pas la connexion qu'il ouvre lors d'une session.
Si tu rappelles ton objet de session "myConnection" dans un autre contexte tu n'a plus accès à la connexion qu'il a du ouvrir au-paravant.
Si tu utilise une connexion persistente, tu n'as plus besoin de mémoriser la connexion dans la session. Ceci est possible par "mysql_pconnect".
Mémoriser ton objet SGBD dans la session, te servira alors simplement à récupèrer (désérialiser) son état à la dernière session connue. L'avantage est que tous les paramètres fixés au-paravant sont mémorisés.
Autrement dit, s'il n'y a rien d'important à mémoriser pour économiser les temps de reconstruction d'un objet, ce dernier n'a pas besoin d'être sérialisé. La recréation (new) suffit dans ce cas pour économiser la mémoire de la session.
Toutefois, il faut savoir que comme on avait besoin du schèma de la classe à la création (instanciation) de l'objet, on en a toujours besoin à sa restauration à partir d'une session.
Avec cet exemple tu vas comprendre, qu'en utilisant mysql_pconnect, la connexion à la base est persistente toute session confuse.
Et que ta sérialisation de l'objet telleque tu l'as faite est purement juste mais ne fait que restaurer l'état de l'objet.
<?php
//La classe SGBD
class SGBD {
//Propriétés
var $myPconnect;
var $paramètres;
//Constructeur
function SGBD ($USER, $PASSWORD, $HOST, $BASE){
if (!session_start()) session_start();
//ouverture d'une base de données par une connexion persistente
$this->myPconnect = mysql_connect($HOST, $USER, $PASSWORD);
$this->myDb = mysql_select_db($BASE, $this->myPconnect);
//mémoriser les paramètres de connexion
$this->paramètres = array("USER"=>$USER, "PASSWORD"=>$PASSWORD, "HOST"=>$HOST, "BASE"=>$BASE);
//Auto mémorisation : sérialisation
$_SESSION["myConnection"] = $this;
}
//une fonction qui liste les tables de la base ouverte
function listTables(){
$tables = mysql_list_tables($this->paramètres ["BASE"]) or die ("<p>Erreur: ".mysql_error());
if ($tables)
while ($table = mysql_fetch_object($tables)){
$t[] = $table;
}
return $t;
}
}
//un programme qui utilise cette classe
session_start();
//Paramètres de connexion
define ("USER", "root");
define ("PASSWORD", "");
define ("HOST", "localhost");
define ("BASE", "test");
//Construction d'un nouvel objet si absent de la session
if(!isset($_SESSION["myConnection"])){
$_SESSION["myConnection"] = new SGBD(USER, PASSWORD, HOST, BASE);
}
//Récupèration de l'état de l'objet à partir de la session : désérialisation
$myConnection = $_SESSION["myConnection"];
//Déboggage : Espion sur l'état de l'objet
echo "<pre>"; print_r($myConnection); echo "</pre>";
//Tester si la connexion persitente est toujours active
echo "<pre>";print_r($myConnection->listTables()); echo "</pre>";
?>