Salut!

Alors j'ai un gros problème avec les sessions. Après avoir lu les tutoriels de deveveloppez.com, j'ai décidé de m'y mettre. Le problème c'est que entre 2 session_start() je perds toutes les variables instanciées dans $_SESSION... Que ce soit dans la page qui suit directement ou pas.

Quelqu'un pourrais m'aider s'il vous plait?

Voici le code du formulaire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
<div>
	<form name="Login" method="post" action="Seraphic-Session/Authentification.php" onsubmit="javascript:submit_pass();">
		<div>
			<input type="hidden" name="Secret" />
			Login:
			<input type="text" name="Login" />
			Mot de passe:
			<input type="password" name="Password" />
			<input type="submit" name="Envoyer" value="Envoyer" />
		</div>
	</form>
</div>
La fonction javascript appelée se contente d'effacer le champ Password et de l'encode dans Secret.

Voici le code d'Authentification.php:
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
<?php
 
include('Sessions.php');
 
 
function connect()
 
{
 
	include_once("../BDD/BDD.php");
 
	mysql_connect(SQL_HOST,SQL_USER,SQL_PASSWORD) or die('<h1>Connexion au serveur impossible.</h1>');
 
	mysql_select_db(SQL_DATABASE) or die('<h1>Connexion impossible à la base.</h1>');
 
}
 
function FormulaireValide()
{
	return (isset($_POST['Login']) && isset($_POST['Secret']));
}
 
function UtilisateurValide($login,$pass)
{
	connect();
	$r = mysql_query("
	SELECT COUNT(*)
	FROM Membres
	WHERE Identifiant='$login'
	AND Password='$pass'
	") or die('Echec de connection!');
 
	mysql_close();
	$r = mysql_fetch_array($r);
	return $r[0]==1;
}
 
function OuvrirSession($login,$pass)
{
 
	session_set();
	session_start();
	$_SESSION['DernierAcces'] = time();
	$_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
	connect();
	$r = mysql_query("
	SELECT Pseudo, Rang
	FROM Membres
	WHERE Identifiant='$login'
	AND Password='$pass'
	") or die('Echec de connection!');
 
	mysql_close();
	$r = mysql_fetch_array($r);
	$_SESSION['User'] = $r['Pseudo'];
	$_SESSION['Rang'] = $r['Rang'];
 
	header("Location: ../admin/Article.php");
}
 
function SessionValide()
{
	if(!FormulaireValide() || !UtilisateurValide($_POST['Login'],$_POST['Secret']))
	{
		header("Location: ../?page=Login.php");
 		die();
	}else{
		OuvrirSession($_POST['Login'],$_POST['Secret']);
	}
}
 
SessionValide();
 
?>
Ce script permet de loguer l'utilisateur si il existe. Jusque là tout marche, j'arrive à me loguer.

Le script suivant contient session_set(), une fonction permettant de modifier la gestion des sessions afin d'utiliser une base de données:
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
<?php
 
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)
{
	connect();
	$resultat = mysql_query("
		SELECT Donnees
		FROM Sessions
		WHERE Identifiant = '".$identifiant_de_session."'
		AND Nom='".$_ENV['nom_de_session']."'
	");
	$Donnees = '';
	if(mysql_num_rows($resultat) == 1)
	{
		$Donnees = mysql_fetch_array($resultat);
	}
	mysql_free_result($resultat);
	mysql_close();
	return strval($Donnees['Donnees']);
}
 
function ecrire_session($identifiant_de_session, $donnees_de_session)
{
 
	connect();
	$result = true;
	mysql_query("
		UPDATE Session
		SET Donnees = '".$donnees_de_session."'
		WHERE Identifiant = '".$identifiant_de_session."'
		AND Nom = '".$_ENV['nom_de_session']."'
	") or $result = false;
   mysql_close();
   return $result;
}
 
function detruire_session($identifiant_de_session)
{
	connect();
	$result = true;
	mysql_query("
		DELETE FROM Sessions
		WHERE Identifiant = '".$identifiant_de_session."'
		AND Nom ='".$_ENV['nom_de_session']."'"
	) or $result = false;
	mysql_close();
   return $result;
}
 
function verifier_validite_session($temps_de_validite)
{
   connect();
   $result = true;
   mysql_query("
   	DELETE FROM Sessions
   	WHERE ADDDATE(DernierAcces, INTERVAL".$temps_de_validite." SECOND) < NOW()
   ") or $result = false;
   mysql_close();
   return $result;
}
 
function session_set()
{
	session_set_save_handler(
		'ouvrir_session',
		'fermer_session',
		'lire_session',
		'ecrire_session',
		'detruire_session',
		'verifier_validite_session'
	);
}
 
?>
Ce qui me chiffonne dans ce code pris dans le tutoriel pour les sessions avec BDD c'est que je ne vois pas d'insertion de tuples avec un INSERT.

Le problème est quand j'arrive à la page ../admin/Article.php: je suis immédiatement redirigé vers la page de loggin.

Voici le code du script en question:
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
<?php
include('../Seraphic-Session/VerificationSession.php');
 
function main()
{
	if (!estRedacteur())
	{
		header('Location: ..');
	}else{
 
		if (!isset($_GET["art"]) || !(estModerateur() || estAuteurDe('Article',$_GET["art"]))) {
 
			ajouterArticle();
 
		}else{
			modifierArticle($_GET["art"]);
 
		}
 
		afficheArticles();
 
	}
}
main();
 
?>
Les fonctions ajouterArticle et modifierArticle n'ont pas de grand intêret pour ce problème, elles marchent déjà.

Pour vérifier que la session n'est pas usurpée, le script VerificationSession.php s'en charge, voici son contenu:
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
<?php
 
include('Sessions.php');
include('Droits.php');
 
function VerifierSession()
{
	if(
		!isset($_SESSION['DernierAcces']) ||
		!isset($_SESSION['IP']) ||
		!isset($_SESSION['User']) ||
		$_SERVER['REMOTE_ADDR']!=$_SESSION['IP']
	)
	{
		$_SESSION=array();
		session_destroy();
		header("Location: ../?page=Login.php");
		die();
	}
}
 
session_set();
session_start();
VerifierSession();
$_SESSION['DernierAcces'] = time();
 
?>
Vient ensuite la bibliothèque Droits.php qui permet de savoir si l'utilisateur a accès à telle ou telle page:
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
<?php
 
function estModerateur()
{
	if (!isset($_SESSION['Rang']))
	{
		return false;
	}
	connect();
	$r = mysql_query("
		SELECT Moderateur
		FROM Rangs
		WHERE Niveau=" . $_SESSION['Rang']
	)or die('Echec niveau mod&eacute;rateur<br />' . mysql_error());
	mysql_close();
	$r = mysql_fetch_array($r);
	return $r['Moderateur']==1;
}
 
function estRedacteur()
{
	if (!isset($_SESSION['Rang']))
	{
		return false;
	}
	connect();
	$r = mysql_query("
		SELECT Redacteur
		FROM Rangs
		WHERE Niveau=" . $_SESSION['Rang']
	)or die('Echec niveau r&eacute;dacteur<br />' . mysql_error());
	mysql_close();
	$r = mysql_fetch_array($r);
	return $r['Redacteur']==1;
}
 
function estMembre()
{
	if (!isset($_SESSION['Rang']))
	{
		return false;
	}
	connect();
	$r = mysql_query("
		SELECT Utilisateur
		FROM Rangs
		WHERE Niveau=" . $_SESSION['Rang']
	)or die('Echec niveau membre<br />' . mysql_error());
	mysql_close();
	$r = mysql_fetch_array($r);
	return $r['Utilisateur']==1;
}
 
function estAuteurDe($Type,$id)
{
	if (!estRedacteur() || !isset($_SESSION['User']))
	{
		return false;
	}else{
		connect();
		$r = mysql_query("
			SELECT COUNT(PosterArticle)
			FROM $Type
			WHERE Auteur=" . $_SESSION['User'] . "
			AND Id$Type=$id
		")or die('Echec niveau auteur<br />' . mysql_error());
		mysql_close();
		$r = mysql_fetch_array($r);
		return $r[0]==1;
	}
}
 
 
?>
Les fonctions de cette bibliothèque retournent des booléens.

Cependant, j'ai eu la mauvaise surprise de voir que mes variables n'étaient plus instanciées (je les avais instanciées dans Authentification.php)

si vous avez des idées, je vous écoute!

Merci d'avance