Bon, ben nous y voilà.
Je vous donne les corrections, et j'expliquerai deux ou trois choses qui me semblent importantes.
membres / connexion.php
Secret (cliquez pour afficher)Code : PHP 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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184 | <?php
/*
Neoterranos & LkY
Page connexion.php
Permet de se connecter au site.
Quelques indications : (Utiliser l'outil de recherche et rechercher les mentions données)
Liste des fonctions :
--------------------------
Aucune fonction
--------------------------
Liste des informations/erreurs :
--------------------------
Membre qui essaie de se connecter alors qu'il l'est déjà
Vous êtes bien connecté
Erreur de mot de passe
Erreur de pseudo doublon (normalement impossible)
Pseudo inconnu
--------------------------
*/
session_start();
header('Content-type: text/html; charset=utf-8');
include('../includes/config.php');
/********Actualisation de la session...**********/
include('../includes/fonctions.php');
connexionbdd();
actualiser_session();
/********Fin actualisation de session...**********/
if(isset($_SESSION['membre_id']))
{
$informations = Array(/*Membre qui essaie de se connecter alors qu'il l'est déjà*/
true,
'Vous êtes déjà connecté',
'Vous êtes déjà connecté avec le pseudo <span class="pseudo">'.htmlspecialchars($_SESSION['membre_pseudo'], ENT_QUOTES).'</span>.',
' - <a href="'.ROOTPATH.'/membres/deconnexion.php">Se déconnecter</a>',
ROOTPATH.'/index.php',
5
);
require_once('../information.php');
exit();
}
if($_POST['validate'] != 'ok')
{
/********Entête et titre de page*********/
$titre = 'Connexion';
include('../includes/haut.php'); //contient le doctype, et head.
/**********Fin entête et titre***********/
?>
<div id="colonne_gauche">
<?php
include('../includes/colg.php');
?>
</div>
<div id="contenu">
<div id="map">
<a href="../index.php">Accueil</a> => <a href="connexion.php">Connexion</a>
</div>
<h1>Formulaire de connexion</h1>
<p>Pour vous connecter, indiquez votre pseudo et votre mot de passe.<br/>
Vous pouvez aussi cocher l'option "Me connecter automatiquement à mon
prochain passage." pour laisser une trace sur votre ordinateur pour être
connecté automatiquement.<br/>
Ce système de trace est basé sur les cookies, ce sont des petits fichiers
contenant votre numéro d'identification ainsi qu'une version cryptée de votre
mot de passe. Ces fichiers ne peuvent en aucun cas endommager votre ordinateur,
ni l'affecter d'aucune façons, vous pourrez les supprimer à tout moment dans
les options de votre navigateur.</p>
<form name="connexion" id="connexion" method="post" action="connexion.php">
<fieldset><legend>Connexion</legend>
<label for="pseudo" class="float">Pseudo :</label> <input type="text" name="pseudo" id="pseudo" value="<?php if(isset($_SESSION['connexion_pseudo'])) echo $_SESSION['connexion_pseudo']; ?>"/><br/>
<label for="mdp" class="float">Passe :</label> <input type="password" name="mdp" id="mdp"/><br/>
<input type="hidden" name="validate" id="validate" value="ok"/>
<input type="checkbox" name="cookie" id="cookie"/> <label for="cookie">Me connecter automatiquement à mon prochain passage.</label><br/>
<div class="center"><input type="submit" value="Connexion" /></div>
</fieldset>
</form>
<h1>Options</h1>
<p><a href="inscription.php">Je ne suis pas inscrit !</a><br/>
<a href="moncompte.php?action=reset">J'ai oublié mon mot de passe !</a>
</p>
<?php
}
else
{
$result = sqlquery("SELECT COUNT(membre_id) AS nbr, membre_id, membre_pseudo, membre_mdp FROM membres WHERE
membre_pseudo = '".mysql_real_escape_string($_POST['pseudo'])."' GROUP BY membre_id", 1);
if($result['nbr'] == 1)
{
if(md5($_POST['mdp']) == $result['membre_mdp'])
{
$_SESSION['membre_id'] = $result['membre_id'];
$_SESSION['membre_pseudo'] = $result['membre_pseudo'];
$_SESSION['membre_mdp'] = $result['membre_mdp'];
unset($_SESSION['connexion_pseudo']);
if(isset($_POST['cookie']) && $_POST['cookie'] == 'on')
{
setcookie('membre_id', $result['membre_id'], time()+365*24*3600);
setcookie('membre_mdp', $result['membre_mdp'], time()+365*24*3600);
}
$informations = Array(/*Vous êtes bien connecté*/
false,
'Connexion réussie',
'Vous êtes désormais connecté avec le pseudo <span class="pseudo">'.htmlspecialchars($_SESSION['membre_pseudo'], ENT_QUOTES).'</span>.',
'',
ROOTPATH.'/index.php',
3
);
require_once('../information.php');
exit();
}
else
{
$_SESSION['connexion_pseudo'] = $_POST['pseudo'];
$informations = Array(/*Erreur de mot de passe*/
true,
'Mauvais mot de passe',
'Vous avez fourni un mot de passe incorrect.',
' - <a href="'.ROOTPATH.'/index.php">Index</a>',
ROOTPATH.'/membres/connexion.php',
3
);
require_once('../information.php');
exit();
}
}
else if($result['nbr'] > 1)
{
$informations = Array(/*Erreur de pseudo doublon (normalement impossible)*/
true,
'Doublon',
'Deux membres ou plus ont le même pseudo, contactez un administrateur pour régler le problème.',
' - <a href="'.ROOTPATH.'/index.php">Index</a>',
ROOTPATH.'/contact.php',
3
);
require_once('../information.php');
exit();
}
else
{
$informations = Array(/*Pseudo inconnu*/
true,
'Pseudo inconnu',
'Le pseudo <span class="pseudo">'.htmlspecialchars($_POST['pseudo'], ENT_QUOTES).'</span> n\'existe pas dans notre base de données. Vous avez probablement fait une erreur.',
' - <a href="'.ROOTPATH.'/index.php">Index</a>',
ROOTPATH.'/membres/connexion.php',
5
);
require_once('../information.php');
exit();
}
}
?>
</div>
<?php
include('../includes/bas.php');
mysql_close();
?>
|
membres / deconnexion.php
Secret (cliquez pour afficher)Code : PHP 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 | <?php
/*
Neoterranos & LkY
Page deconnexion.php
Permet de se déconnecter du site.
Quelques indications : (Utiliser l'outil de recherche et rechercher les mentions données)
Liste des fonctions :
--------------------------
Aucune fonction
--------------------------
Liste des informations/erreurs :
--------------------------
Déconnexion
--------------------------
*/
session_start();
include('../includes/config.php');
include('../includes/fonctions.php');
connexionbdd();
mysql_query("DELETE FROM connectes WHERE connectes_id = ".$_SESSION['membre_id']) or exit(mysql_error());
vider_cookie();
session_destroy();
$informations = Array(/*Déconnexion*/
false,
'Déconnexion',
'Vous êtes à présent déconnecté.',
' - <a href="'.ROOTPATH.'/membres/connexion.php">Se connecter</a>',
ROOTPATH.'/index.php',
5
);
require_once('../information.php');
exit();
?>
|
connexion.php
Déjà, ma manière de faire qu'un formulaire et sa validation soient sur la même page consiste à utiliser une variable
post
qui se trouvera dans un
input
caché du formulaire. C'est une méthode ; on pourrait aussi vérifier un des champs du formulaire, mais pour des raisons pratiques, je ne le fais pas : comme ça, si je modifie le formulaire, je ne touche pas à ce champ et la page reste valable.
Niveau SQL, beaucoup de monde fait une requête type
SELECT * WHERE pseudo=$_POST['pseudo'] AND passe=$_POST['passe']
: je n'utilise pas cette méthode, non pas parce qu'elle est moins bien, juste parce que j'ai l'habitude de celle que je vous propose. En plus, ça me permettait de vous montrer comment sélectionner des données et faire un
COUNT()
en même temps ; en effet, essayez en retirant
GROUP BY membre_id
, vous aurez droit à une belle erreur.
À vrai dire, on se fiche pas mal de pouvoir faire un
count
et un
select
ici, mais bon, comme ça, vous le saurez à l'avenir.

L'option
se souvenir de moi est tout ce qu'il y a de plus banal.
Bref, cette correction vous révèle certains de mes tics en PHP, pas forcément mieux ni même bien, mais ce sont les miens : ce sont des automatismes, et je vous invite à les modifier s'ils ne vous plaisent pas, et à me dire en commentaire si pour une raison ou pour une autre, vous estimez que je devrais éditer ces codes pour utiliser des méthodes différentes.
Pour en revenir aux actions de la page, elle fait bien tout ce que je vous ai raconté :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | <?php
if(isset($_SESSION['membre_id']))
{
$informations = Array(/*Membre qui essaie de se connecter alors qu'il l'est déjà*/
true,
'Vous êtes déjà connecté',
'Vous êtes déjà connecté avec le pseudo <span class="pseudo">'.htmlspecialchars($_SESSION['membre_pseudo'], ENT_QUOTES).'</span>.',
' - <a href="'.ROOTPATH.'/membres/deconnexion.php">Se déconnecter</a>',
ROOTPATH.'/index.php',
5
);
require_once('../information.php');
exit();
}
?>
|
Ici on vérifie le statut du visiteur, on pourrait le renvoyer bêtement à l'index, mais contrairement à l'inscription, la connexion est assez fréquente, il suffit que l'utilisateur ait le lien vers la connexion en historique et il se fait refouler sans précisions, contrairement à l'inscription, je mets un message.
Code : PHP1
2
3 | <?php
if($_POST['validate'] != 'ok')
?>
|
Voilà ma variable cachée en action.
Code : PHP1 | <label for="pseudo" class="float">Pseudo :</label> <input type="text" name="pseudo" id="pseudo" value="<?php if(isset($_SESSION['connexion_pseudo'])) echo $_SESSION['connexion_pseudo']; ?>"/><br/>
|
Ici la variable
souvenir
.
Le reste c'est du test de pseudo, mot de passe et affichage d'erreurs.
deconnexion.php
Ici, rien de compliqué non plus : je vide les cookies, j'efface les sessions, et j'affiche un message pour confirmer que le membre s'est déconnecté.
