Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 02/01/2013, 10h59   #1
superthx
Membre à l'essai
 
Inscription : juillet 2003
Messages : 87
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 87
Points : 22
Points : 22
Par défaut Menu selon utilisateurs

Bonjour,

En fouillant dans le forum ja'ai trouvee ceci.
http://www.developpez.net/forums/d82...selon-session/

J'ai le code suivant mais je sais pas si peux le mettre ou pas pour l'adapter a mon code.

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
<?php
// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
	if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {
 
		$base = mysql_connect ('monhost', 'moncompte', 'monpass');
		mysql_select_db ('matable', $base);
 
		// on teste si une entrée de la base contient ce couple login / pass
		$sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"';
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		$data = mysql_fetch_array($req);
 
		mysql_free_result($req);
		mysql_close();
 
		// si on obtient une réponse, alors l'utilisateur est un membre
		if ($data[0] == 1) {
			session_start();
			$_SESSION['login'] = $_POST['login'];
			header('Location: membre.php');
			exit();
		}
		// si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
		elseif ($data[0] == 0) {
			$erreur = 'Compte non reconnu.';
		}
		// sinon, alors la, il y a un gros problème :)
		else {
			$erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
		}
	}
	else {
		$erreur = 'Au moins un des champs est vide.';
	}
 
}
?>
<html>
<head>
<title>Accueil</title>
</head>
 
<body>
Connexion à l'espace membre :<br />
<form action="index.php" method="post">
Login : <input type="text" name="login" value="<?php if (isset($_POST['login'])) echo htmlentities(trim($_POST['login'])); ?>"><br />
Mot de passe : <input type="password" name="pass" value="<?php if (isset($_POST['pass'])) echo htmlentities(trim($_POST['pass'])); ?>"><br />
<input type="submit" name="connexion" value="Connexion">
</form>
<a href="inscription.php">Vous inscrire</a>
<?php
if (isset($erreur)) echo '<br /><br />',$erreur;
?>
</body>
</html>
J'ai ajouter dans ma table en plus de, login,pass,pass_md5. J'ai mis compte. Ou on specifie si util ou admin.

Je pense qu'il faut modifier ici

Code :
1
2
3
4
5
6
7
8
 
// si on obtient une réponse, alors l'utilisateur est un membre
	if ($data[0] == 1) {
	session_start();
	$_SESSION['login'] = $_POST['login'];
	header('Location: membre.php');
	exit();
	}
Est ce que j'ai bon ??? Merci de votre aide.
superthx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 11h45   #2
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 707
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 707
Points : 6 576
Points : 6 576
Envoyer un message via Skype™ à rawsrc
Salut,

le meilleur moyen pour savoir si t'as bon c'est d'essayer, non ?

Tu peux factoriser un peu ton code :
- empty() fait déjà la vérification isset(),
- il est bien plus performant de laisser le moteur PHP gérer en interne la libération des ressources de base de données, donc tu n'as pas besoin de mysql_free_result() ni de mysql_close(),
- les fonctions mysql_xxx ont été abandonnées au profit de PDO ou des fonctions mysqli_xxx, pense à migrer,
- enfin, factorise le code de connexion à ta base de données car je pense que tu en auras besoin un peu partout...
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 12h00   #3
superthx
Membre à l'essai
 
Inscription : juillet 2003
Messages : 87
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 87
Points : 22
Points : 22
Merci d'avoir répondu. J'ai déjà essayer plusieurs méthode.
Peut etre ais je oublier de mettre le code de membre.php

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
session_start();
if (!isset($_SESSION['login'])) {
	header ('Location: index.php');
	exit();
}
?>
 
<html>
<head>
<title>Espace membre</title>
</head>
 
<body>
Bienvenue<?php echo htmlentities(trim($_SESSION['login'])); ?>!<br />
<a href="deconnexion.php">Déconnexion</a>
</body>
</html>
Je comprend que lorsque on est validée on va sur membre.php
Mais est ce possible que membre.php redirige selon le type de compte (admin ou util) qui correspond au login ?

PS: Quand a mysql_xxx, etc.... C'est bien beau mais pour moi c'est du charabia. Et je dois avouer que le code que j'ai mis sur le forum n'est pas de moi. Mais j'essai de faire mon bout de chemin en comprenant ce qui ne va pas. C'est pour un usage interne chez moi et non pour être sur le net. Tous le monde n'est pas doué comme ceux qui me repondent.
superthx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 13h45   #4
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 707
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 707
Points : 6 576
Points : 6 576
Envoyer un message via Skype™ à rawsrc
J'ai repris ton premier code en y incluant des commentaires afin de te permettre d'arriver à tes fins :
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
<?php
 
$error = '';
$login = '';
$pwd   = '';
 
if (isset($_POST['connexion']) && $_POST['connexion'] === 'connexion') {
    if ( ! (empty($_POST['login']) || empty($_POST['pass']))) {
 
        $cnx = mysql_connect('monhost', 'moncompte', 'monpass');
        if ($cnx === false) {
            die('Connection failure');
        }
 
        if (mysql_select_db('matable', $cnx) === false) {
            die('Select database failure');
        }
 
        $login = trim($_POST['login']);
        $pwd   = trim($_POST['pass']);
 
        // on extrait directement les données de l'utilisateur au lieu de vérifier son existence
        // dans les données, il doit y avoir le rôle (admin, user, reader...)
        $sql  = 'SELECT * FROM membre WHERE login="'.mysql_escape_string($login).'" AND pass_md5="'.mysql_escape_string(md5($pwd)).'"';
        $exec = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
 
        // l'erreur : "Plusieurs membres ont les mêmes identifiants de connexion" ne devrait jamais se produire
        // dans la mesure où cette éventualité doit être gérée directement par la base de données qui doit
        // rejeter les enregistrements enfreignant l'unicité de l'identifiant de connexion
 
        $data = mysql_fetch_assoc($exec);
 
        if (empty($data)) {
            $error = 'Compte non reconnu.';
        }
        else {
            session_start();
            // on enregistre en session tous les attributs de l'utilisateur
            $_SESSION['user'] = $data;
            header('Location: membre.php');
            exit;
        }
    }
    else {
        $error = 'Au moins un des champs est vide.';
    }
}
 
// fonction d'échappement des caractères dangereux (UTF-8)
$hsc = function($p) { return htmlspecialchars($p); };
?>
<html>
<head>
<title>Accueil</title>
</head>
 
<body>
Connexion à l'espace membre :<br />
<form action="index.php" method="post">
    Login : <input type="text" name="login" value="<?php echo $hsc($login) ?>"><br />
    Mot de passe : <input type="password" name="pass" value="<?php echo $hsc($pwd) ?>"><br />
<input type="submit" name="connexion" value="connexion">
</form>
<a href="inscription.php">Vous inscrire</a>
<?php if ( ! empty($error)): ?>
    <br /><br /><?php echo $hsc($error) ?>
<?php endif ?>
</body>
</html>
et voilà une idée de fichier membre.php qui redirige en fonction des droits :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
session_start();
 
if (empty($_SESSION['user'])) {
    header('Location: index.php');
    exit;
}
 
$redirects = array(
    'admin'  => 'accueil_administrateur.php',
    'user'   => 'accueil_utilisateur.php',
    'reader' => 'accueil_lecteur.php',
);
 
$role = $_SESSION['user']['role'];
header("Location: {$redirects[$role]}");
exit;
?>
Bref à creuser mais l'idée est là.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 13h50   #5
superthx
Membre à l'essai
 
Inscription : juillet 2003
Messages : 87
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 87
Points : 22
Points : 22
Merci rawsrc. Je vais tester cela ce soir. Je te tiens au courant..........
superthx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 14h36   #6
superthx
Membre à l'essai
 
Inscription : juillet 2003
Messages : 87
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 87
Points : 22
Points : 22
Ok,

Je met se qui se passe (pour comprendre).

Dans,
Code :
1
2
3
$error = '';
$login = '';
$pwd   = '';
Je sais pas si je dois remplir ceci. Et si oui avec quoi ?

Dans,
Code :
1
2
3
4
5
6
7
        else {
            session_start();
            // on enregistre en session tous les attributs de l'utilisateur
            $_SESSION['user'] = $data;
            header('Location: membre.php');
            exit;
        }
Je dois changer user par login ???

Dans,
Code :
1
2
// fonction d'échappement des caractères dangereux (UTF-8)
$hsc = function($p) { return htmlspecialchars($p); };
Dreamweaver me met une erreur syntaxe.

Ensuite allons a membre.php

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
session_start();
 
if (empty($_SESSION['user'])) {
    header('Location: index.php');
    exit;
}
 
$redirects = array(
    'admin'  => 'admin.php',
    'user'   => 'util.php',
    'reader' => 'accueil_lecteur.php',
);
 
$role = $_SESSION['user']['role'];
header("Location: {$redirects[$role]}");
exit;
?>
Dois je changer
Code :
if (empty($_SESSION['user'])) {
par
Code :
if (empty($_SESSION['login'])) {
superthx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 14h58   #7
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 707
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 707
Points : 6 576
Points : 6 576
Envoyer un message via Skype™ à rawsrc
Tu ne dois rien changer en l'état.
J'ai juste modifié légèrement le suivi de l'utilisateur pour que tu puisses arriver à tes fins dans les redirections de membre.php
Relis mes commentaires.

Au lieu de stocker uniquement le login en session, on stocke toutes les données de l'utilisateur. En gros on a quelque chose comme ça :
Code :
1
2
3
4
5
6
$_SESSION['user'] = array(
    'id'       => 14568722,
    'login'    => 'superthx',
    'password' => '458df254fg689fm',    // hashé avec md5
    'role'     => 'admin'
);
J'ai supposé que ta table t_membre avait comme colonnes : id, login, password, role.

Et je te conseillerai de jeter Dreamweaver, c'est une croûte sans compter qu'il existe des IDE gratuits qui sont bien mieux adaptés (Netbeans, Eclipse...).
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 17h36   #8
superthx
Membre à l'essai
 
Inscription : juillet 2003
Messages : 87
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 87
Points : 22
Points : 22
Merci,

Sa marche correctement en mettant ton code et modifiant ce que j'ai.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
session_start();
 
if (empty($_SESSION['user'])) {
    header('Location: index.php');
    exit;
}
 
$redirects = array(
    'admin'  => 'admin.php',
    'util'   => 'util.php',
    'reader' => 'accueil_lecteur.php',
);
 
$compte = $_SESSION['user']['compte'];
header("Location: {$redirects[$compte]}");
exit;
?>
Si je me connecte selon le type de compte je suis bien rediriger.

Mais je rencontre un hic....

Comment protéger admin.php et util.php ne puissent être accessible que par le type de membres ? Faut il modifier quelque chose dans chaque fichier.? Merci.
superthx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 18h53   #9
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 707
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 707
Points : 6 576
Points : 6 576
Envoyer un message via Skype™ à rawsrc
simple, dans admin.php ceci devrait suffire
Code :
1
2
3
4
5
6
7
8
9
10
11
session_start();
 
if (empty($_SESSION['user'])) {
    header('Location: index.php');
    exit;
}
 
if ($_SESSION['user']['compte'] !== 'admin') {
    header("HTTP/1.1 403 Forbidden");
    exit;
}
comme tu peux t'en rendre compte, tu devrais commencer à réfléchir à la manière de factoriser le code redondant...
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/01/2013, 19h31   #10
superthx
Membre à l'essai
 
Inscription : juillet 2003
Messages : 87
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 87
Points : 22
Points : 22
Citation:
Envoyé par rawsrc Voir le message
simple, dans admin.php ceci devrait suffire
Code :
1
2
3
4
5
6
7
8
9
10
11
session_start();
 
if (empty($_SESSION['user'])) {
    header('Location: index.php');
    exit;
}
 
if ($_SESSION['user']['compte'] !== 'admin') {
    header("HTTP/1.1 403 Forbidden");
    exit;
}
comme tu peux t'en rendre compte, tu devrais commencer à réfléchir à la manière de factoriser le code redondant...
C'est PARFAIT

J'ai pas tout compris....... Mais c'est exactement ce que je voulais faire.
Je te remercie 1000X....... de m'avoir donner tes solutions.....
Pas evident le php pour moi.
superthx est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h12.


 
 
 
 
Partenaires

Hébergement Web