Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/05/2007, 21h19   #1
Invité régulier
 
Inscription : mai 2007
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 45
Points : 9
Points : 9
Par défaut Session sur plusieurs pages

Bonsoir,

Je travaille actuellement sur un projet web, et pour une adminstration je voudrais utiliser les sessions.

Il y a un fichier index.php, et mes pages sont tout simplement des fonctions présent dans la page index.php.

Quand je vais sur ma page index.php, il m'affiche ma fonction index(). Il affiche le formulaire pour s'identifier et ensuite affiche la fonction index qui est caché si on es pas identifier.

Malheureusement quand je clic dans ma page caché vers une autre page, la fonction p2()(qui devrait être une deuxieme page) ne s'affiche pas mais le formulaire d'identification et quand je le remplis je retombe sur ma fonction index().

Code :
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
session_start();
 
$_SESSION['connect'] = 0;
 
define('CHECK_INDEX', TRUE);
 
include('global.php');
 
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
	.'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">'
	.'<head>'
	.'<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />'
	.'<meta http-equiv="content-style-type" content="text/css" />'
	.'<title>Ecrire - '.$projet['site_name'].'</title>'
	.'<link rel="stylesheet" type="text/css" href="style/style.css"/>'
	.'</head>'
	.'<body>';
 
echo '<div id="header"><div id="header-logo"></div></div>';
 
if(!empty($_GET['Deconnexion']))
{
	$_SESSION = array();
	if (isset($_COOKIE[session_name()]))
	{
		setcookie(session_name(),'',time()-4200,'/');
	}
 
	session_destroy();
}
elseif(!empty($_GET['P2']))
{
	p2();
}
else
{
 
		index();
}
 
function index()
{
 
	if(isset($_POST['login']) && isset($_POST['passe']))
	{
		$login = $_POST['login'];
		$passe = $_POST['passe'];
		$postconnexion = 1; 
	}
	else
	{
		$login = '';
		$passe = '';
	}
 
	if($login == 'Plougy' && $passe == 'passe')
	{
		$_SESSION['connect'] = 1;
		session_register('login', 'passe');
 
	echo '<div id="contenu">';
 
echo '<div id="deconnexion">'.$login.'<br /><a href="index.php?Deconnexion">Déconnexion</a></div><br /><div style="text-align: center;"><h1>Administration</h1></div>';
 
	echo '<div style="text-align:center;"><a href="index.php?P2">Page 2</a></div>';
 
	echo '</div>'; // FIN CONTENU
}
else
{	
	echo '<div id="contenu">';
 
	if($postconnexion)
	{
		echo '<div id="connexion-erreur">Une erreur est survenue</div><br />';
	}
	echo '<strong>Connection à l\'administration</strong>';
	echo'<form action="index.php" method="post">'
	.'<p class="pclickform"><label for="login">Votre login :</label><input type="text" name="login" id="login"/></p>'
	.'<p class="pclickform"><label for="passe">Votre passe :</label><input type="password" name="passe" id="passe"/></p>'
	.'<p class="pclickform"><input type="submit" value="Valider"/></p>'
	.'</form>';
 
	echo '</div>';
}
}
 
function p2()
{
if (isset($_SESSION['connect']))//On vérifie que le variable existe
{
        $connect=$_SESSION['connect'];//On récupère la valeur de la variable de session
}
else
{
        $connect=0;//Si $_SESSION['connect'] n'existe pas, on donne la valeur "0"
}
 
if ($connect == 1) // Si le visiteur s'est identifié
{
	echo '<div style="text-align:center;"><h2> Page 2 </h2></div>';
}
}
 
echo '</body>'
	.'</html>';
?>
Je voudrais me connecter une seul fois, et ensuite aller dans les pages que je veux dans mon administration et quand j'ai fini me déconnecter.

Merci
Plougy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2007, 21h33   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Votre variable de session connect est écrasée à chaque appel de la page via :
Code :
$_SESSION['connect'] = 0;
Sachant que vous testez son existence pour savoir si vous êtes ou non connectés elle n'est pas vraiment nécessaire. Si vous souhaitez la définir si ce n'est pas déjà le cas ajoutez un test avec (!)isset avant.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2007, 22h03   #3
Invité régulier
 
Inscription : mai 2007
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 45
Points : 9
Points : 9
Citation:
Envoyé par julp
Votre variable de session connect est écrasée à chaque appel de la page via :
Code :
$_SESSION['connect'] = 0;
Sachant que vous testez son existence pour savoir si vous êtes ou non connectés elle n'est pas vraiment nécessaire. Si vous souhaitez la définir si ce n'est pas déjà le cas ajoutez un test avec (!)isset avant.
J'ai enlevé la variable au début, mais rien ne ce passe...

Plougy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2007, 22h23   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Je crois avoir trouvé un test erroné :
Code :
elseif(!empty($_GET['P2']))
Celui ci-dessous serait plus approprié car ce paramètre ne prend pas de valeur :
Code :
elseif(isset($_GET['P2']))
Note : la fonction session_register est dépréciée (utilisez plutôt $_SESSION['login'] = $passe;) et $postconnexion n'est pas définie au début ($postconnexion = 0; à ajouter dans le else ?).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2007, 22h44   #5
Invité régulier
 
Inscription : mai 2007
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 45
Points : 9
Points : 9
Citation:
Envoyé par julp
Je crois avoir trouvé un test erroné :
Code :
elseif(!empty($_GET['P2']))
Celui ci-dessous serait plus approprié car ce paramètre ne prend pas de valeur :
Code :
elseif(isset($_GET['P2']))
Note : la fonction session_register est dépréciée (utilisez plutôt $_SESSION['login'] = $passe et $postconnexion n'est pas définie au début ($postconnexion = 0; à ajouter dans le else ?).
Oh je vous remercie fort !

Sinon, comment savoir la prochaine fois lequel utiliser la prochaine fois entre isset et !empty ?

Merci
Plougy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2007, 22h57   #6
Invité régulier
 
Inscription : mai 2007
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 45
Points : 9
Points : 9
Une question me vient maintenant que j'ai réglé le plus gros problème :

Code :
1
2
3
4
5
6
	if(isset($_POST['login']) && isset($_POST['passe']))
	{
		$login = $_POST['login'];
		$passe = $_POST['passe'];
		$postconnexion = 1; 
	}
Dans ma fonction index() je récupère le $_POST['login'] et le $_POST['passe'], je voudrais savoir comment faire pour supprimer ce POST après les avoir récupérer (Si cela est possible).

Car quand je rafraichis ma page caché, il me dit qu'elle contient des données envoyer par POST, et j'aime pas trop ça...

Merci
Plougy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2007, 23h08   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par Plougy
Sinon, comment savoir la prochaine fois lequel utiliser la prochaine fois entre isset et !empty ?
Attention à empty effectivement : isset teste uniquement l'existence d'une variable (a-t-elle été définie ?). En revanche, empty vous renverra FALSE si :
  • la variable n'est pas définie (le seul point commun avec isset) ou
  • la variable peut être interprétée comme une valeur nulle : la chaîne vide, FALSE, NULL, un tableau vide, une valeur numérique entière ou décimale nulle (0, 0.0, etc) ou la valeur entière nulle sous forme de chaîne (ie : '0')

Le but était de savoir si $_GET['P2'] était ou non définie. Sa valeur nous importe peu puisqu'elle n'est pas utilisée et par conséquent empty, dans tous les cas, vous renvoyait FALSE car soit elle n'est pas définie soit c'est une chaîne vide.

Citation:
Envoyé par Plougy
je voudrais savoir comment faire pour supprimer ce POST après les avoir récupérer (Si cela est possible).
C'est le navigateur qui vous les renvoie donc côté serveur il faudrait faire une redirection ou utiliser la session (mais dans votre cas ça ne présente pas de réel intérêt).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 00h03   #8
Invité régulier
 
Inscription : mai 2007
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 45
Points : 9
Points : 9
Je vous remercie pour l'explication.

J'ai trouver un petite erreur, mais je ne sais pas vraiment comment la résoudre...

Quand je clic sur des liens (exemple : index.php?Preferences ) qui se trouve dans mon index ou autre page il les affiches, mais quand je fais un lien tout court vers index.php il m'affiche le formulaire d'inscription...

Comment résoudre ce problème ?
Plougy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 00h09   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
La session existe bien la deuxième fois que vous passez par index.php tout court mais ces variables ne sont pas testées/utilisées c'est pourquoi vous retrouvez le formulaire. Etait-ce bien votre question ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 00h33   #10
Invité régulier
 
Inscription : mai 2007
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 45
Points : 9
Points : 9
Je voulais savoir comment faire pour éviter d'avoir le formulaire quand je clic sur un lien qui est censé ramener à l'accueil.

Merci
Plougy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 11h40   #11
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
C'est bien ce que je disais

Remplacer :
Code :
1
2
	if($login == 'Plougy' && $passe == 'passe')
	{
Par exemple, en :
Code :
1
2
3
4
5
6
	if((isset($_SESSION['connect']) && $_SESSION['connect'] == 1) xor ($login == 'Plougy' && $passe == 'passe'))
	{
		if (!isset($_SESSION['login'])) {
			$_SESSION['connect'] = 1;
			$_SESSION['login'] = $passe;
		}
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 20h33   #12
Invité régulier
 
Inscription : mai 2007
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 45
Points : 9
Points : 9
Bonsoir,

J'ai réussi à faire que quand je clic sur un lien index.php ça ne renvoit pas le formulaire.

Sinon je rencontre un soucis maintenant, sur la connexion via une BDD. Il n'arrive pas à me connecté, mon script n'est il pas bon ?

Code :
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
function index()
{
	global $projet;
	if(isset($_POST['login']) && isset($_POST['passe']))
	{
		$login = $_POST['login'];
		$passe = $_POST['passe'];
		$postconnexion = 1; 
	}
	else
	{
		$login = '';
		$passe = '';
	}
 
	$sql = 'SELECT * FROM '.$projet['prefix'].'_user ORDER BY user';
	$req = mysql_query($sql) or die(mysql_error());
 
	while ($donnees = mysql_fetch_array($req))
	{
		$user = $donnees['user'];
		$password = md5($donnees['password']);
	}
 
 	if(($login == $user && $passe == $password) or (isset($_SESSION['connect']) && $_SESSION['connect'] == 1))
	{
		if($login == $user && $passe == $password){
			$_SESSION['connect'] = 1;
			$_SESSION['login'] = $login;
		}
 
		$login = $GLOBALS['login'];	
 
 
echo '<div id="menu"><a href="index.php">#Main</a></div><div id="deconnexion">'.$login.'<br /><a href="index.php?Deconnexion">Déconnexion</a></div><br /><div style="text-align: center;"><h1>Administration</h1>';
Merci
Plougy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 21h13   #13
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
ça ne sert strictement à rien de parcourir toute la table surtout en la triant. Utilisez la clause WHERE pour ne sélectionner que les enregistrements qui correspondent à ces login/mot de passe et la fonction d'aggrégation COUNT qui vous permet de savoir combien y correspondent (normalement c'est un seul ou aucun) :
Code :
1
2
3
4
5
	$sql = 'SELECT COUNT(*) FROM '.$projet['prefix'].'_user WHERE user=\'' . mysql_real_escape_string($login) . '\' AND password = \'' . md5($password) . '\'';
	$req = mysql_query($sql) or die(mysql_error());
	$res = mysql_fetch_row($req);
 
 	if($res[0] == 1 or ...) {
Mais il faudrait revoir vos tests : inutile de faire la requête si les variables $login et $passe sont initialisées à vide.

Quant au problème sur la variable $login, c'est sans doute dû à la ligne ci-dessous :
Code :
$login = $GLOBALS['login'];
Je ne sais pas ce que vous cherchez à faire avec celle-ci

Recommandation : développez avec error_reporting à E_ALL (pour PHP 5 à E_ALL|E_STRICT serait encore mieux) qui vous mettra tout de suite la puce à l'oreille lorsque quelque chose ne va pas du fait des messages d'erreurs affichés et votre code en sera d'autant plus propre.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 22h11   #14
Invité régulier
 
Inscription : mai 2007
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 45
Points : 9
Points : 9
Citation:
Envoyé par julp
ça ne sert strictement à rien de parcourir toute la table surtout en la triant. Utilisez la clause WHERE pour ne sélectionner que les enregistrements qui correspondent à ces login/mot de passe et la fonction d'aggrégation COUNT qui vous permet de savoir combien y correspondent (normalement c'est un seul ou aucun) :
Code :
1
2
3
4
5
	$sql = 'SELECT COUNT(*) FROM '.$projet['prefix'].'_user WHERE user=\'' . mysql_real_escape_string($login) . '\' AND password = \'' . md5($password) . '\'';
	$req = mysql_query($sql) or die(mysql_error());
	$res = mysql_fetch_row($req);
 
 	if($res[0] == 1 or ...) {
Mais il faudrait revoir vos tests : inutile de faire la requête si les variables $login et $passe sont initialisées à vide.
J'ai réussi avant votre réponse, j'y ai apporté des modifications avec votre réponse (comme pour éviter de tout parcourir).

Et la requête, je l'ai déplacé pour éviter de la faire s'il n'y a pas de variable $login et $passe.

Citation:
Envoyé par julp
Quant au problème sur la variable $login, c'est sans doute dû à la ligne ci-dessous :
Code :
$login = $GLOBALS['login'];
Je ne sais pas ce que vous cherchez à faire avec celle-ci
Sa sert à afficher l'identifier dans l'administration.

Merci pour toutes vos réponses et votre aide précieuse dans l'avancement de mon projet.


Plougy
Plougy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 22h22   #15
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par Plougy
J'ai réussi avant votre réponse, j'y ai apporté des modifications avec votre réponse (comme pour éviter de tout parcourir).

Et la requête, je l'ai déplacé pour éviter de la faire s'il n'y a pas de variable $login et $passe.


Citation:
Envoyé par Plougy
Sa sert à afficher l'identifier dans l'administration.

Merci pour toutes vos réponses et votre aide précieuse dans l'avancement de mon projet.
Autant pour moi, n'ayant pas copié/collé le début, j'avais omis que cette instruction figurait dans une fonction.

La fonction index() doit être appelée avant d'utiliser $login en dehors de celle-ci (sauf que cette fonction n'est pas toujours appelée). N'oubliez pas que vous y avez normalement accès directement via la session ($_SESSION['login']).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h40.


 
 
 
 
Partenaires

Hébergement Web