EDIT: Solution aux posts #4 (et #5)
Bonjour a tous.
J'ai un objet "$user->panier", que je serialize pour rentrer dans une variable de session. Probleme, lorsque je "unserialize" l'object, il devient un object de la StdClass et ne me sert donc plus a rien.
Pourtant, la définition de la classe PANIER (celle de l'objet) est faite AVANT le session_start(), etc..
Le petit soupson que j'ai: l'objet $user->panier est créé, comme vous pouvez le voir, DANS le constructeur de la classe USER. c'est dans cette même classe USER qu'elle est sérializée et unsérializée. Ca pourai venir de la ?
Bon, bref, voici le code.
La fameuse classe qui renit son objet (la méchante!):
la classe USER au travers de laquelle la classe PANIER est manipulé:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 <?php class PANIER { public $articles = array(); public $date_dodo = 0; public function __get ($name) { $value = null; if ($name == "nombre_d_articles") { $value = $this->nombre_d_articles(); } elseif ($name == "total") { $value = $this->get_total(); } elseif ($name == "articles") { $value = $this->articles; } else { if (!isset($this->articles[$name])) $value = 0; else $value = $this->articles[$name]; } return $value; } public function __set ($name,$value) { $this->articles[$name] = $value; return true; } public function remove ($name) { unset($this->aricles[$name]); return true; } public function nombre_d_articles () { return array_sum($this->articles); } // retourne le prix total public function get_total () { $db = DB::getMe(); $total = 0; foreach ($this->articles as $k => $v) $total += PRODUIT::prix($k) * $v; return $total; } public function __sleep () { foreach ($this->articles as $k => $v) if ($v <= 0) unset($this->articles[$k]); $this->date_dodo = time(); } } ?>
et le lieu du crime:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 class USER { private static $instance; private function __construct ($login) { $db = DB::getMe(); // a proteger !! // $q = "SELECT * FROM `client` WHERE `login` = '$login'"; $r = $db->queryfetchobject($q); $this->nom = $r->nom; $this->prenom = $r->prenom; $this->login = $r->login; $this->password = $r->password; $this->mail = $r->mail; /* etc.. */ // restore le panier $this->panier = new PANIER (); if (!empty($_SESSION['cart'])) $this->panier = unserialize($_SESSION['cart']); } public static function getMe ($login=null) { if (!empty($login)) self::$instance = new USER ($login); elseif (empty(self::$instance)) self::$instance = new USER ($_SESSION['login']); return self::$instance; } public function ajouter_au_panier($id,$qte) { if (isset($this->panier->{"id".$id})) { $this->panier->{"id".$id} += $qte; } else $this->panier->{"id".$id} = $qte; $this->backup_panier(); } public function enlever_du_panier($id,$qte) { if (isset($this->panier->{"id".$id})) { $this->panier->{"id".$id} -= $qte; if ($this->panier->{"id".$id}<=0) $this->panier->remove("id".$id); } $this->backup_panier(); } private function backup_panier() { if (!empty($this->panier)) { $panier = serialize($this->panier); $_SESSION['cart'] = $panier; } else unset ($_SESSION['cart']); } public function __destruct () { $this->backup_panier(); } } ?>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 <?php require ("inc/panier.class.php"); require ("inc/user.class.php"); session_start(); require ("include.php"); // le reste du programme. /* .. reste de la page .. */ $user = USER::getMe(); echo "<pre>";print_r($_SESSION);echo"</pre>"; /* * Et cette ligne ci dessu, donne ( le drame !) : * [ ...blabla..] * [cart] => O:8:"stdClass":1:{s:4:"id26";i:1;} <-- StdClass :'-( * [..blabla..] * */ ?>
Donc si quelqu'un pouvait m'aider, ou m'indiquer un piste de recherche, quelque chose..
Merci par avance.
Cordialement, Damien.
Partager