Bonjour à tous,

J'ai un pitit problème avec mes variables de sessions ... je m'explique :
Pour un client, j'ai utilisé un tuto du site pour réaliser un panier en PHP avec les sessions (rien de plus, pas d'identification) jusque là pas de pb ... sauf que, hébergé chez OVH, mon panier ne dure pas plus de 30 min. sans activité (ce qui ne plait pas au client en question).

J'ai donc utilisé un autre tuto pour stocker mes sessions dans une base MySQL voici le code du tuto (j'ai fait un copier-coller dans mon code en changeant juste les identifiants de ma base) :

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
 
<?php
/**
 * SGBD est une constante contenant l'adresse du serveur MySQL. [typiquement 'localhost']
 * LOGIN_SGBD est une constante contenant votre login pour la connection au serveur MySQL.
 * MOT_DE_PASSE_SGBD est une constante contenant votre mot de passe pour la connection au serveur MySQL.
 * SESSIONS_BDD est une constante contenant le nom de la base de données où sont stockées les données. [ici, 'my_database']
 * SESSION_TABLE est une constante contenant le nom de la table où sont stockées les données. [ici, 'sessions']
*/
 
function ouvrir_session($chemin_de_stockage, $nom_de_session)
{
  $_ENV['nom_de_session'] = $nom_de_session;
  return true;
}
 
function fermer_session()
{
  return true; // Rien à faire
}
 
function lire_session($identifiant_de_session)
{
@ $mysql = mysql_connect(SGBD, LOGIN_SGBD, MOT_DE_PASSE_SGBD); mysql_select_db(SESSIONS_BDD);
  if(!$mysql)
  {
    return '';
  }
$resultat = mysql_query('SELECT donnees FROM '.SESSIONS_TABLE.' WHERE identifiant = \''.$identifiant_de_session.'\' AND nom =\''.$_ENV['nom_de_session'].'\'');
  $donnes = '';
  if(mysql_num_rows($resultat) == 1)
  $donnees = mysql_fetch_array($resultat);
  mysql_free_result($resultat);
  mysql_close($mysql);
  return strval($donnes['donnees']);
}
 
function ecrire_session($identifiant_de_session, $donnees_de_session)
{
@ $mysql = mysql_connect(SGBD, LOGIN_SGBD, MOT_DE_PASSE_SGBD); mysql_select_db(SESSIONS_BDD);
  if(!$mysql)
  {
  	return false;
  }
  $result = true;
mysql_query('UPDATE '.SESSIONS_TABLE.' SET donnees =\''.$donnees_de_session.'\''.' WHERE identifiant = \''.$identifiant_de_session.'\' AND nom =\''.$_ENV['nom_de_session'].'\'') or $result = false;
  mysql_close($mysql);
  return $result;
}
 
function detruire_session($identifiant_de_session)
{
@ $mysql = mysql_connect(SGBD, LOGIN_SGBD, MOT_DE_PASSE_SGBD); mysql_select_db(SESSIONS_BDD);
  if(!$mysql)
  {
  	return false;
  }
  $result = true;
mysql_query('DELETE FROM '.SESSIONS_TABLE.' WHERE identifiant = \''.$identifiant_de_session.'\''.' AND nom =\''.$_ENV['nom_de_session'].'\'') or $result = false;
mysql_close($mysql);
  return $result;
}
 
function verifier_validite_session($temps_de_validite)
{
@ $mysql = mysql_connect(SGBD, LOGIN_SGBD, MOT_DE_PASSE_SGBD); mysql_select_db(SESSIONS_BDD);
  if(!$mysql)
  {
  	return false;
  }
  $result = true;
mysql_query('DELETE FROM '.SESSIONS_TABLE.' WHERE ADDDATE(dernier_acces, INTERVAL '.$temps_de_validite.' SECOND) < NOW()')
    or $result = false;
  mysql_close($mysql);
  return $result;
}
 
session_set_save_handler(
  'ouvrir_session',
  'fermer_session',
  'lire_session',
  'ecrire_session',
  'detruire_session',
  'verifier_validite_session'
);
 
session_start();
 
// Maintenant on peut se servir des sessions sans modifications par rapport à avant...
// C'est complètement transparent pour l'utilisateur.
?>
Ce code est inséré tout en haut de mon header.inc.php et donc se relance à toutes les pages.

Et bien sûr ça ne marche pas, aucun message d'erreur mais mon caddy reste désespérément vide et dans mas table "sessions", rien ne s'inscrit.

Le plus bizarre, c'est que si j'ajoute 5 produits (par exemple) avec ce code, je ne vois rien dans mon caddie. Mais si je supprime tout le code au dessus du session_start() (je supprime aussi le session_set_save_handler) et que je rafraichis ma page d'affichage du caddie, mes 5 produits réapparaissent ! Comme si une partie du code au dessus du session_start() était ignorée ...

J'ai relu le code (et le tuto) hier jusqu'à pas d'heure et je ne comprends toujours pas.

Si vous aviez quelques pistes ça m'arrangerai et ça m'éviterai de mourir dans d'atroces souffrances de la main d'un philatéliste (mon client !)

Merci d'avance