Hello,

une petite question sur les sessions.
Mon site est sur OVH, logiquement je suis en php 5.3

J'ai un problème sur la récupération des sessions.
Elles sont utilisées au niveau de la page d'administration où je stocke :
  • le login
  • mdp md5
  • et ma connexion à ma bdd


Le site à toujours marché comme ça mais depuis peu, j'ai des erreurs disant que ma session ne peut pas être déserialisée.

unserialize() expects parameter 1 to be string

Voici comment je fais:
Une fois le login et mdp validés, je sérialise mon objet Session (de ma classe session)
ex :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
$oSession = new classSession($login, $pwd); // Creation de la session
 
	if($oSession -> isValid()) // Si les identifiants sont valides
	{		
		$_SESSION["oSession"] = serialize($oSession); // on met l'objet session en variable de session
		Rediriger("admin.php"); // On redirige vers l'espace correspondant
	}
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
64
65
66
67
68
 
<?php
 
class classSession
{
	#***********************************************************
	#	Proprietes
	#***********************************************************
	private $_myLogin;
	private $_myPwd;
	private $_oConnection;
 
	#***********************************************************
	# Constructeur
	#***********************************************************
	public function __construct($myLogin=NULL, $myPwd=NULL)
	{
		$this -> _myLogin = $myLogin;
		$this -> _myPwd = md5($myPwd);
		$this -> _oConnection = new classConnection();
	}
 
	#***********************************************************
	# Destructeur
	#***********************************************************
	public function __destruct()
	{
		$this -> _oConnection -> __destruct();
	}
 
	#***********************************************************
	# Appel le destructeur de maniere implicite
	#***********************************************************
	public function __sleep()
	{
		return array('_myLogin', '_myPwd','_oConnection');
	}
 
	#***********************************************************
	# Relance la connexion a la bdd
	#***********************************************************
	public function __wakeup()
	{
	}
 
	#***********************************************************
	# Authentification de l'utilisateur
	#***********************************************************
	public function isValid()
	{
		$bool = false;
 
		$strSql = " SELECT Utilisateur_Identifiant ";
		$strSql .= " FROM utilisateur WHERE Utilisateur_Identifiant = '".$this -> _myLogin."'";
		$strSql .= " AND Utilisateur_MotDePasse = '".$this -> _myPwd."'";
 
		$this -> _oConnection -> execSql($strSql);
 
		if($this -> _oConnection -> getNbRow() != 0)
		{
			$bool = true;
		}
 
		return $bool;
	}
}
 
?>
Sur les pages suivantes, voici comment je procède :

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
 
<?php
require("../autoload.php");
session_start();
 
if(isset($_SESSION['oSession']))
{	
	$oSession = unserialize($_SESSION['oSession']);	
 
	if($oSession -> isValid() ==  false)
	{
		Rediriger("erreur.php");
	}
}
else
{
	Rediriger("erreur.php");
}
Alors d'une, la déserialisation ne fonctionne plus (alors que mon site est en ligne depuis quelques mois déjà...et ça marchait bien comme ça...)
et forcément, comme la désérialisation s'est mal passée, mon objet session n'arrive pas à appeler ma fonction IsValid.
Je tiens à préciser que mes classes sont bien chargées avant.

Alors du coup j'ai résolu ce problème avec la méthode du père François, c'est à dire je ne serialize plus mon objet:

Je fais directement
$_SESSION["oSession"] = $oSession au lieu de $_SESSION["oSession"] = serialize($oSession);

et pareil pour la désérialiser, j'enlève unserialize.

du coup sans sérialiser, les fonctions magiques __sleep() et __wakeup() ne sont plus utilisées je pense.

A moins qu'il y ai eu des changements entre php 5.2 et 5.3...
Faut il continuer à utiliser serialize ? ou est-ce transparent maintenant ?