La validation ne demande pas de grandes compétences en PHP, juste un peu de méthode.
Ce sera, avec la page d'édition de profil, la plus grosse de notre espace membres, car il y a beaucoup de vérifications à faire, encore que, j'ai converti pas mal de choses en fonctions, car elles resserviront pour la page d'édition.
Attaquons, sans plus attendre, la page de validation.
Dans le dossier
membres, créez le fichier
trait-inscription.php.
Ajoutons-y ceci tout de suite :
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 | <?php
/*
Neoterranos & LkY
Page trait-inscription.php
Permet de valider son inscription.
Quelques indications : (utiliser l'outil de recherche et rechercher les mentions données)
Liste des fonctions :
--------------------------
Aucune fonction
--------------------------
Liste des informations/erreurs :
--------------------------
Déjà inscrit (en cas de bug...)
--------------------------
*/
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']))
{
header('Location: '.ROOTPATH.'/index.php');
exit();
}
?>
|
Là, je vais vous informer d'une idée que j'ai eue qui consiste à créer, si l'inscription est réussie, une variable de session
$_SESSION['inscrit']
et de la comparer à
$_POST['pseudo']
.
Dans quel but ? Imaginons que notre homme valide son inscription et que pour une raison ou une autre, le site plante avant la confirmation, ou que le navigateur du bonhomme plante ou un autre problème du genre.
En revenant, le membre va réessayer de s'inscrire avec le même pseudo, et la variable de session lui indiquera qu'il s'est déjà inscrit et qu'il peut se connecter.
Bon : vous me direz que son utilité est contestable, mais c'est une idée que je propose ; je vous rappelle quand même que le système se veut le plus personnalisable possible, donc n'hésitez pas à modifier des trucs. Moi-même, si je m'en sers (faudrait déjà que je me décide à faire un site), je le modifierai probablement.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | <?php
if($_SESSION['inscrit'] == $_POST['pseudo'] && trim($_POST['inscrit']) != '')
{
$informations = Array(/*Déjà inscrit (en cas de bug...)*/
true,
'Vous êtes déjà inscrit',
'Vous avez déjà complété une inscription avec le pseudo <span class="pseudo">'.htmlspecialchars($_SESSION['inscrit'], ENT_QUOTES).'</span>.',
' - <a href="'.ROOTPATH.'/index.php">Retourner à l\'index</a>',
ROOTPATH.'/membres/connexion.php',
5
);
require_once('../information.php');
exit();
}
?>
|
Une nouvelle classe fait son apparition, éditons donc le CSS.
Code : CSS1
2
3 | .pseudo {
font-weight: bold;
}
|
Bon, stoppons le blabla : après cette formalité, on va devoir attaquer directement les fonctions avant de continuer la page d'inscription, car sinon, je sens que je vais vous perdre.
Les fonctions
checkpseudo
La première fonction s'occupera du pseudo : elle devra vérifier dans l'ordre si le pseudo est vide, ensuite, s'il est trop court ou trop long, et enfin s'il est pris, sinon, c'est bon.
La fonction retournera un code pour chaque erreur, et le code
ok
si c'est bon.
Secret (cliquez pour afficher)Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | <?php
function checkpseudo($pseudo)
{
if($pseudo == '') return 'empty';
else if(strlen($pseudo) < 3) return 'tooshort';
else if(strlen($pseudo) > 32) return 'toolong';
else
{
$result = sqlquery("SELECT COUNT(*) AS nbr FROM membres WHERE membre_pseudo = '".mysql_real_escape_string($pseudo)."'", 1);
global $queries;
$queries++;
if($result['nbr'] > 0) return 'exists';
else return 'ok';
}
}
?>
|
Vous avez maintenant déjà une idée de la tête qu'auront les autres fonctions.
checkmdp
checkmdp
devra vérifier si le mot de passe entré est ni trop long ni trop court, s'il contient au moins un chiffre et au moins une majuscule, sinon, tout est ok pour le mot de passe.
Secret (cliquez pour afficher)Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | <?php
function checkmdp($mdp)
{
if($mdp == '') return 'empty';
else if(strlen($mdp) < 4) return 'tooshort';
else if(strlen($mdp) > 50) return 'toolong';
else
{
if(!preg_match('#[0-9]{1,}#', $mdp)) return 'nofigure';
else if(!preg_match('#[A-Z]{1,}#', $mdp)) return 'noupcap';
else return 'ok';
}
}
?>
|
checkmdpS
Cette fonction devra vérifier que le mot de passe de vérification correspond au mot de passe (et même s'ils sont différents, les deux doivent être non vides pour être déclarés différents), sinon on retourne une erreur ; s'ils sont pareils, on le passe au même traitement que le mot de passe.
Secret (cliquez pour afficher)Code : PHP1
2
3
4
5
6
7 | <?php
function checkmdpS($mdp, $mdp2)
{
if($mdp != $mdp2 && $mdp != '' && $mdp2 != '') return 'different';
else return checkmdp($mdp);
}
?>
|
checkmail
Cette fonction devra vérifier le format du mail via
regexp, et si le mail n'est pas déjà pris.
Je ne vous explique pas la
regexp, M@teo a fait exactement la même dans son tuto.
Secret (cliquez pour afficher)Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | <?php
function checkmail($email)
{
if($email == '') return 'empty';
else if(!preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#is', $email)) return 'isnt';
else
{
$result = sqlquery("SELECT COUNT(*) AS nbr FROM membres WHERE membre_mail = '".mysql_real_escape_string($email)."'", 1);
global $queries;
$queries++;
if($result['nbr'] > 0) return 'exists';
else return 'ok';
}
}
?>
|
checkmailS
Cette fonction fait comme
checkmdpS
.
Secret (cliquez pour afficher)Code : PHP1
2
3
4
5
6
7 | <?php
function checkmailS($email, $email2)
{
if($email != $email2 && $email != '' && $email2 != '') return 'different';
else return 'ok';
}
?>
|
birthdate
Cette fonction est un peu plus longue que les autres.
Elle devra vérifier le format de la date de naissance (deux /), l'âge de l'utilisateur (vous voulez vraiment un enfant de 4 ans sur votre site ?

), l'existence de la date, enfin valider celle-ci si c'est bon.
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 | <?php
function birthdate($date)
{
if($date == '') return 'empty';
else if(substr_count($date, '/') != 2) return 'format';
else
{
$DATE = explode('/', $date);
if(date('Y') - $DATE[2] <= 4) return 'tooyoung';
else if(date('Y') - $DATE[2] >= 135) return 'tooold';
else if($DATE[2]%4 == 0)
{
$maxdays = Array('31', '29', '31', '30', '31', '30', '31', '31', '30', '31', '30', '31');
if($DATE[0] > $maxdays[$DATE[1]-1]) return 'invalid';
else return 'ok';
}
else
{
$maxdays = Array('31', '28', '31', '30', '31', '30', '31', '31', '30', '31', '30', '31');
if($DATE[0] > $maxdays[$DATE[1]-1]) return 'invalid';
else return 'ok';
}
}
}
?>
|
vidersession
Durant toute l'inscription, on va mettre dans
$_SESSION
plein de variables car si la validation n'est pas correcte, on renvoie le visiteur sur le formulaire d'inscription, on affiche à nouveau les erreurs que l'on a rencontrées, et on pré-remplit les champs qui étaient corrects.
Mais si l'inscription se passe bien, juste avant de créer
$_SESSION['inscrit']
on va vider toute la session sans
session_destroy()
, car sinon on peut pas créer
$_SESSION['inscrit']
.
Un simple
foreach
suffit.
Secret (cliquez pour afficher)Code : PHP1
2
3
4
5
6
7
8
9 | <?php
function vidersession()
{
foreach($_SESSION as $cle => $element)
{
unset($_SESSION[$cle]);
}
}
?>
|
Voilà, nos fonctions sont prêtes, passons à la suite.

Nota : une autre solution consiste à mettre toutes ces variables temporaires dans une variable
$_SESSION['temp']
.
On aura donc
$_SESSION['temp']['form_pseudo']
etc.
Vous n'aurez alors qu'à faire un
unset()
sur
$_SESSION['temp']
pour vider le formulaire temporaire.
Validation proprement dite
Bon : on a fini les fonctions, revenons à
trait-inscription.php.
Maintenant que les fonctions sont prêtes, il suffit pour chaque champ du formulaire de vérifier s'il existe (
isset
), de supprimer les espaces en début et fin de chaîne (
trim
), de les passer par leurs fonctions respectives ; enfin, de mettre les bonnes erreurs en session et de créer une variable
$_SESSION['erreurs']
qui recense le nombre d'erreurs.
On y va, c'est très facile : essayez d'abord sans regarder mon code.
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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305 | <?php
/*Code anti-pompage sans lecture :p*/
exit('Pour ceux qui recopient bêtement ce code sans avoir essayé, sachez que vous êtes bien
bêtes, le but de ce tuto est de vous entraîner à comprendre et à coder en PHP. Tci
il n\'y a rien de dur, c\'est un simple traitement de l\'information fournie par des fonctions
et de la définition de variables, alors pomper ce code sans essayer tout seul, c\'est vraiment
pas une attitude de Zér0 :o)');
/********Étude du bazar envoyé***********/
$_SESSION['erreurs'] = 0;
//Pseudo
if(isset($_POST['pseudo']))
{
$pseudo = trim($_POST['pseudo']);
$pseudo_result = checkpseudo($pseudo);
if($pseudo_result == 'tooshort')
{
$_SESSION['pseudo_info'] = '<span class="erreur">Le pseudo '.htmlspecialchars($pseudo, ENT_QUOTES).' est trop court, vous devez en choisir un plus long (minimum 3 caractères).</span><br/>';
$_SESSION['form_pseudo'] = '';
$_SESSION['erreurs']++;
}
else if($pseudo_result == 'toolong')
{
$_SESSION['pseudo_info'] = '<span class="erreur">Le pseudo '.htmlspecialchars($pseudo, ENT_QUOTES).' est trop long, vous devez en choisir un plus court (maximum 32 caractères).</span><br/>';
$_SESSION['form_pseudo'] = '';
$_SESSION['erreurs']++;
}
else if($pseudo_result == 'exists')
{
$_SESSION['pseudo_info'] = '<span class="erreur">Le pseudo '.htmlspecialchars($pseudo, ENT_QUOTES).' est déjà pris, choisissez-en un autre.</span><br/>';
$_SESSION['form_pseudo'] = '';
$_SESSION['erreurs']++;
}
else if($pseudo_result == 'ok')
{
$_SESSION['pseudo_info'] = '';
$_SESSION['form_pseudo'] = $pseudo;
}
else if($pseudo_result == 'empty')
{
$_SESSION['pseudo_info'] = '<span class="erreur">Vous n\'avez pas entré de pseudo.</span><br/>';
$_SESSION['form_pseudo'] = '';
$_SESSION['erreurs']++;
}
}
else
{
header('Location: ../index.php');
exit();
}
//Mot de passe
if(isset($_POST['mdp']))
{
$mdp = trim($_POST['mdp']);
$mdp_result = checkmdp($mdp, '');
if($mdp_result == 'tooshort')
{
$_SESSION['mdp_info'] = '<span class="erreur">Le mot de passe entré est trop court, changez-en pour un plus long (minimum 4 caractères).</span><br/>';
$_SESSION['form_mdp'] = '';
$_SESSION['erreurs']++;
}
else if($mdp_result == 'toolong')
{
$_SESSION['mdp_info'] = '<span class="erreur">Le mot de passe entré est trop long, changez-en pour un plus court. (maximum 50 caractères)</span><br/>';
$_SESSION['form_mdp'] = '';
$_SESSION['erreurs']++;
}
else if($mdp_result == 'nofigure')
{
$_SESSION['mdp_info'] = '<span class="erreur">Votre mot de passe doit contenir au moins un chiffre.</span><br/>';
$_SESSION['form_mdp'] = '';
$_SESSION['erreurs']++;
}
else if($mdp_result == 'noupcap')
{
$_SESSION['mdp_info'] = '<span class="erreur">Votre mot de passe doit contenir au moins une majuscule.</span><br/>';
$_SESSION['form_mdp'] = '';
$_SESSION['erreurs']++;
}
else if($mdp_result == 'ok')
{
$_SESSION['mdp_info'] = '';
$_SESSION['form_mdp'] = $mdp;
}
else if($mdp_result == 'empty')
{
$_SESSION['mdp_info'] = '<span class="erreur">Vous n\'avez pas entré de mot de passe.</span><br/>';
$_SESSION['form_mdp'] = '';
$_SESSION['erreurs']++;
}
}
else
{
header('Location: ../index.php');
exit();
}
//Mot de passe suite
if(isset($_POST['mdp_verif']))
{
$mdp_verif = trim($_POST['mdp_verif']);
$mdp_verif_result = checkmdpS($mdp_verif, $mdp);
if($mdp_verif_result == 'different')
{
$_SESSION['mdp_verif_info'] = '<span class="erreur">Le mot de passe de vérification diffère du mot de passe.</span><br/>';
$_SESSION['form_mdp_verif'] = '';
$_SESSION['erreurs']++;
if(isset($_SESSION['form_mdp'])) unset($_SESSION['form_mdp']);
}
else
{
if($mdp_verif_result == 'ok')
{
$_SESSION['form_mdp_verif'] = $mdp_verif;
$_SESSION['mdp_verif_info'] = '';
}
else
{
$_SESSION['mdp_verif_info'] = str_replace('passe', 'passe de vérification', $_SESSION['mdp_info']);
$_SESSION['form_mdp_verif'] = '';
$_SESSION['erreurs']++;
}
}
}
else
{
header('Location: ../index.php');
exit();
}
//mail
if(isset($_POST['mail']))
{
$mail = trim($_POST['mail']);
$mail_result = checkmail($mail);
if($mail_result == 'isnt')
{
$_SESSION['mail_info'] = '<span class="erreur">Le mail '.htmlspecialchars($mail, ENT_QUOTES).' n\'est pas valide.</span><br/>';
$_SESSION['form_mail'] = '';
$_SESSION['erreurs']++;
}
else if($mail_result == 'exists')
{
$_SESSION['mail_info'] = '<span class="erreur">Le mail '.htmlspecialchars($mail, ENT_QUOTES).' est déjà pris, <a href="../contact.php">contactez-nous</a> si vous pensez à une erreur.</span><br/>';
$_SESSION['form_mail'] = '';
$_SESSION['erreurs']++;
}
else if($mail_result == 'ok')
{
$_SESSION['mail_info'] = '';
$_SESSION['form_mail'] = $mail;
}
else if($mail_result == 'empty')
{
$_SESSION['mail_info'] = '<span class="erreur">Vous n\'avez pas entré de mail.</span><br/>';
$_SESSION['form_mail'] = '';
$_SESSION['erreurs']++;
}
}
else
{
header('Location: ../index.php');
exit();
}
//mail suite
if(isset($_POST['mail_verif']))
{
$mail_verif = trim($_POST['mail_verif']);
$mail_verif_result = checkmailS($mail_verif, $mail);
if($mail_verif_result == 'different')
{
$_SESSION['mail_verif_info'] = '<span class="erreur">Le mail de vérification diffère du mail.</span><br/>';
$_SESSION['form_mail_verif'] = '';
$_SESSION['erreurs']++;
}
else
{
if($mail_result == 'ok')
{
$_SESSION['mail_verif_info'] = '';
$_SESSION['form_mail_verif'] = $mail_verif;
}
else
{
$_SESSION['mail_verif_info'] = str_replace(' mail', ' mail de vérification', $_SESSION['mail_info']);
$_SESSION['form_mail_verif'] = '';
$_SESSION['erreurs']++;
}
}
}
else
{
header('Location: ../index.php');
exit();
}
//date de naissance
if(isset($_POST['date_naissance']))
{
$date_naissance = trim($_POST['date_naissance']);
$date_naissance_result = birthdate($date_naissance);
if($date_naissance_result == 'format')
{
$_SESSION['date_naissance_info'] = '<span class="erreur">Date de naissance au mauvais format ou invalide.</span><br/>';
$_SESSION['form_date_naissance'] = '';
$_SESSION['erreurs']++;
}
else if($date_naissance_result == 'tooyoung')
{
$_SESSION['date_naissance_info'] = '<span class="erreur">Agagagougougou areuh ? (Vous êtes trop jeune pour vous inscrire ici.)</span><br/>';
$_SESSION['form_date_naissance'] = '';
$_SESSION['erreurs']++;
}
else if($date_naissance_result == 'tooold')
{
$_SESSION['date_naissance_info'] = '<span class="erreur">Plus de 135 ans ? Mouais...</span><br/>';
$_SESSION['form_date_naissance'] = '';
$_SESSION['erreurs']++;
}
else if($date_naissance_result == 'invalid')
{
$_SESSION['date_naissance_info'] = '<span class="erreur">Le '.htmlspecialchars($date_naissance, ENT_QUOTES).' n\'existe pas.</span><br/>';
$_SESSION['form_date_naissance'] = '';
$_SESSION['erreurs']++;
}
else if($date_naissance_result == 'ok')
{
$_SESSION['date_naissance_info'] = '';
$_SESSION['form_date_naissance'] = $date_naissance;
}
else if($date_naissance_result == 'empty')
{
$_SESSION['date_naissance_info'] = '<span class="erreur">Vous n\'avez pas entré de date de naissance.</span><br/>';
$_SESSION['form_date_naissance'] = '';
$_SESSION['erreurs']++;
}
}
else
{
header('Location: ../index.php');
exit();
}
//qcm
if($_SESSION['reponse1'] == $_POST['reponse1'] && $_SESSION['reponse2'] == $_POST['reponse2'] && $_SESSION['reponse3'] == $_POST['reponse3'] && isset($_POST['reponse1']) && isset($_POST['reponse2']) && isset($_POST['reponse3']))
{
$_SESSION['qcm_info'] = '';
}
else
{
$_SESSION['qcm_info'] = '<span class="erreur">Au moins une des réponses au QCM charte est fausse.</span><br/>';
$_SESSION['erreurs']++;
}
//captcha
if($_POST['captcha'] == $_SESSION['captcha'] && isset($_POST['captcha']) && isset($_SESSION['captcha']))
{
$_SESSION['captcha_info'] = '';
}
else
{
$_SESSION['captcha_info'] = '<span class="erreur">Vous n\'avez pas recopié correctement le contenu de l\'image.</span><br/>';
$_SESSION['erreurs']++;
}
unset($_SESSION['reponse1'], $_SESSION['reponse2'], $_SESSION['reponse3']);
unset($_SESSION['captcha']);
/*************Fin étude******************/
?>
|
Voilà, le traitement à proprement parler est fini ; on va maintenant afficher le titre de la page et faire une insertion du tout si tout s'est bien passé.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | <?php
/********Entête et titre de page*********/
if($_SESSION['erreurs'] > 0) $titre = 'Erreur : Inscription 2/2';
else $titre = 'Inscription 2/2';
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">
<!-- Absence de lien à Inscription 2/2 volontaire -->
<a href="../index.php">Accueil</a> => Inscription 2/2
</div>
|
À présent, nous allons attaquer un subtil détail que je n'ai pas encore énoncé.
S'il n'y a pas d'erreur, on va définir une requête et tenter de l'appliquer.
Seulement, imaginons qu'une fraction de secondes après la vérification du pseudo pour un visiteur X, un visiteur Y s'inscrive avec le même pseudo : la vérification du pseudo dans le traitement indique qu'il est libre, mais le visiteur X envoie alors la requête et prend le pseudo.
Le visiteur Y va alors envoyer la requête à son tour et là, deux possibilités.
1°) Vous n'aviez pas prévu ça, et on a deux utilisateurs ayant le même pseudo sur votre site, ce qui est fort gênant.
2°) Vous aviez prévu ça et le visiteur Y se fait refuser car le champ
pseudo
est configuré en UNIQUE, mais il ne sait pas pourquoi il s'est fait jeter !
Voici un schéma pour vous aider à comprendre :
t1 : Mr X valide son formulaire
avec le pseudo "patate". |
Axe du temps :
 |
t1 : Mr Y n'a pas encore validé. |
t2 : Le pseudo "patate" est libre,
Mr X peut donc s'inscrire
avec. |
t2 : Mr Y valide son formulaire
avec le pseudo "patate". |
t3 : La requête d'insertion du formulaire
de Mr X n'a pas encore eu lieu, mais son
formulaire n'a pas rencontré d'erreurs. |
t3 : Le pseudo "patate" est encore
libre, Mr Y peut donc s'inscrire
avec. |
t4 : Mr X est finalement inscrit
avec le pseudo "patate". |
t4 : Le formulaire de mr Y n'a pas
rencontré d'erreurs. |
t5 : Mr X est inscrit, on
l'oublie. |
t5 : Insertion du formulaire de Mr Y ;
deux cas possibles : le premier,
le champ pseudo n'est pas en
unique, Mr Y est inscrit avec
le même pseudo que Mr X ;
deuxième cas, le champ pseudo
est en unique, et Mr Y se voit
refuser son inscription, il faut
donc lui créer un message d'erreur
explicite, car il ne comprendra pas
"duplicate entry for 'patate' [...]
" |
Vous avez compris, je veux travailler le cas où on l'empêche de s'inscrire, mais on lui explique pourquoi l'inscription est refusée.
Ça va être un peu nouveau pour vous, on va faire appel à une fonction sur
mysql_error()
que vous ne connaissez pas tous :
stripos
.
stripos
recherche la première occurrence d'une chaîne dans une autre et retourne sa position (qui peut valoir 0 si le premier caractère de l'occurrence est le premier de la chaîne),
stripos
est insensible à la casse contrairement à
strpos
.
Code : PHP1
2
3
4
5 | <?php
echo stripos('abcdefg', 'ab'); //echo 0, car a est le premier caractère de abcdefg;
echo stripos('abcdefg', 'gh'); //FALSE
echo stripos('abcdefg', 'd'); //echo 3;, car d est le 4e caractère de abcdefg
?>
|
Il est important de noter que la fonction peut retourner 0, donc il faudra utiliser === pour tester l'égalité et !== pour tester l'inégalité.
Les opérateurs ===/!== marchent comme ==/!= sauf qu'ils vérifient aussi si les variables sont de même type ou non.
Le meilleur exemple est avec 0 ou 1 et respectivement
FALSE
et
TRUE
.
Si vous testez l'égalité entre 0 et
FALSE
, vous trouverez que celle-ci est vraie ; or, 0 est un entier, et
FALSE
est un booléen, c'est l'une des caractéristique de PHP, c'est un langage faiblement typé. Du coup, on dit que 0 est un équivalent de
FALSE
en PHP.
Seulement, on a parfois besoin que l'égalité entre 0 et
FALSE
soit fausse, on utilisera donc === qui teste aussi le type.
Exemple :
Code : PHP1
2
3
4
5
6 | <?php
if(0 == FALSE) echo 'Oooohhhh! 0 == False !!<br/>';
else echo 'Oh non, 0 != False :(<br/>';
if(0 === FALSE) echo 'Aahhhhhhh! 0 === False !!<br/>';
else echo 'Oh, 0 !== False :x'; //On sent l'inspiration :p
?>
|
Retour de ce code :
Citation : Pas de titreOooohhhh! 0 == False !!
Oh, 0 !== False :x
Compris ?
Dans le code d'erreur SQL, si le problème vient d'un champ unique, le nom qu'on a tenté d'insérer est affiché : donc, avec
stripos
, on va chercher le pseudo et / ou le mail dans l'erreur.
Allons-y.
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 | <!--Test des erreurs et envoi-->
<?php
if($_SESSION['erreurs'] == 0)
{
$insertion = "INSERT INTO membres VALUES(NULL, '".mysql_real_escape_string($pseudo)."',
'".md5($mdp)."', '".mysql_real_escape_string($mail)."',
".time().", '".mysql_real_escape_string($date_naissance)."',
'', '',
'', '',
'', '',
'', '',
".time().", 0)";
if(mysql_query($insertion))
{
$queries++;
vidersession();
$_SESSION['inscrit'] = $pseudo;
/*informe qu'il s'est déjà inscrit s'il actualise, si son navigateur
bugue avant l'affichage de la page et qu'il recharge la page, etc.*/
?>
<h1>Inscription validée !</h1>
<p>Nous vous remercions de vous être inscrit sur notre site, votre inscription a été validée !<br/>
Vous pouvez vous connecter avec vos identifiants <a href="connexion.php">ici</a>.
</p>
<?php
}
else
{
if(stripos(mysql_error(), $_SESSION['form_pseudo']) !== FALSE) // recherche du pseudo
{
unset($_SESSION['form_pseudo']);
$_SESSION['pseudo_info'] = '<span class="erreur">Le pseudo '.htmlspecialchars($pseudo, ENT_QUOTES).' est déjà pris, choisissez-en un autre.</span><br/>';
$_SESSION['erreurs']++;
}
if(stripos(mysql_error(), $_SESSION['form_mail']) !== FALSE) //recherche du mail
{
unset($_SESSION['form_mail']);
unset($_SESSION['form_mail_verif']);
$_SESSION['mail_info'] = '<span class="erreur">Le mail '.htmlspecialchars($mail, ENT_QUOTES).' est déjà pris, <a href="../contact.php">contactez-nous</a> si vous pensez à une erreur.</span><br/>';
$_SESSION['mail_verif_info'] = str_replace('mail', 'mail de vérification', $_SESSION['mail_info']);
$_SESSION['erreurs']++;
$_SESSION['erreurs']++;
}
if($_SESSION['erreurs'] == 0)
{
$sqlbug = true; //plantage SQL.
$_SESSION['erreurs']++;
}
}
}
?>
|
Rien de choquant ici : si vous aviez compris le fonctionnement de
stripos
et que vous aviez vu comment on marchait, vous saviez faire ça.
Enfin, s'il y a des erreurs, on utilise pas
else if
, car
$_SESSION['erreurs']
a pu devenir supérieur à 0 dans le
if
, donc on fait une nouvelle condition.
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 | <?php
if($_SESSION['erreurs'] > 0)
{
if($_SESSION['erreurs'] == 1) $_SESSION['nb_erreurs'] = '<span class="erreur">Il y a eu 1 erreur.</span><br/>';
else $_SESSION['nb_erreurs'] = '<span class="erreur">Il y a eu '.$_SESSION['erreurs'].' erreurs.</span><br/>';
?>
<h1>Inscription non validée.</h1>
<p>Vous avez rempli le formulaire d'inscription du site et nous vous en remercions, cependant, nous n'avons
pas pu valider votre inscription, en voici les raisons :<br/>
<?php
echo $_SESSION['nb_erreurs'];
echo $_SESSION['pseudo_info'];
echo $_SESSION['mdp_info'];
echo $_SESSION['mdp_verif_info'];
echo $_SESSION['mail_info'];
echo $_SESSION['mail_verif_info'];
echo $_SESSION['date_naissance_info'];
echo $_SESSION['qcm_info'];
echo $_SESSION['captcha_info'];
if($sqlbug !== true)
{
?>
Nous vous proposons donc de revenir à la page précédente pour corriger les erreurs. (Attention, que vous
l'ayez correctement remplie ou non, la partie sur la charte et l'image est à refaire intégralement.)</p>
<div class="center"><a href="inscription.php">Retour</a></div>
<?php
}
else
{
?>
Une erreur est survenue dans la base de données, votre formulaire semble ne pas contenir d'erreurs, donc
il est possible que le problème vienne de notre côté, réessayez de vous inscrire ou contactez-nous.</p>
<div class="center"><a href="inscription.php">Retenter une inscription</a> - <a href="../contact.php">Contactez-nous</a></div>
<?php
}
}
?>
</div>
<?php
include('../includes/bas.php');
?>
<!--fin-->
|
Voilà,
trait-inscription.php est fini : si vous avez tenté d'en coder une majeure partie vous-mêmes sans pomper le code, alors vous êtes gagnants ; les autres, ben... vous n'êtes pas de vrais Zér0s.
Maintenant, vous avez vu qu'on a utilisé des sessions et qu'on propose de revenir à
inscription.php si l'inscription échoue.
Ce n'est pas pour rien, les sessions : on va modifier
inscription.php pour qu'elle affiche à nouveau les erreurs qu'il y a eu si l'entier
$_SESSION['erreurs']
est supérieur à 0 et pour pré-remplir les champs corrects.
Pour le coup, je vous donne le code directement, car il n'y a rien de technique, c'est juste de la gestion d'affichage.
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 | <div id="contenu">
<div id="map">
<a href="../index.php">Accueil</a> => <a href="inscription.php">Inscription 1/2</a>
</div>
<?php
if($_SESSION['erreurs'] > 0)
{
?>
<div class="border-red">
<h1>Note :</h1>
<p>
Lors de votre dernière tentative d'inscription, des erreurs sont survenues, en voici la liste :<br/>
<?php
echo $_SESSION['nb_erreurs'];
echo $_SESSION['pseudo_info'];
echo $_SESSION['mdp_info'];
echo $_SESSION['mdp_verif_info'];
echo $_SESSION['mail_info'];
echo $_SESSION['mail_verif_info'];
echo $_SESSION['date_naissance_info'];
echo $_SESSION['qcm_info'];
echo $_SESSION['captcha_info'];
?>
Nous vous avons pré-rempli les champs qui étaient corrects.<br/>
Note : la partie QCM et image est entièrement à refaire, que vous vous soyez trompé ou non.
</p>
</div>
<?php
}
?>
<h1>Formulaire d'inscription</h1>
<p>Bienvenue sur la page d'inscription de mon site !<br/>
Merci de remplir ces champs pour continuer.</p>
<form action="trait-inscription.php" method="post" name="Inscription">
<fieldset><legend>Identifiants</legend>
<label for="pseudo" class="float">Pseudo :</label> <input type="text" name="pseudo" id="pseudo" size="30" value="<?php if($_SESSION['pseudo_info'] == '') echo htmlspecialchars($_SESSION['form_pseudo'], ENT_QUOTES) ; ?>" /> <em>(compris entre 3 et 32 caractères)</em><br />
<label for="mdp" class="float">Mot de passe :</label> <input type="password" name="mdp" id="mdp" size="30" value="<?php if($_SESSION['mdp_info'] == '') echo htmlspecialchars($_SESSION['form_mdp'], ENT_QUOTES) ; ?>" /> <em>(compris entre 4 et 50 caractères)</em><br />
<label for="mdp_verif" class="float">Mot de passe (vérification) :</label> <input type="password" name="mdp_verif" id="mdp_verif" size="30" value="<?php if($_SESSION['mdp_verif_info'] == '') echo htmlspecialchars($_SESSION['form_mdp_verif'], ENT_QUOTES) ; ?>" /><br />
<label for="mail" class="float">Mail :</label> <input type="text" name="mail" id="mail" size="30" value="<?php if($_SESSION['mail_info'] == '') echo htmlspecialchars($_SESSION['form_mail'], ENT_QUOTES) ; ?>" /> <br />
<label for="mail_verif" class="float">Mail (vérification) :</label> <input type="text" name="mail_verif" id="mail_verif" size="30" value="<?php if($_SESSION['mail_verif__info'] == '') echo htmlspecialchars($_SESSION['form_mail_verif'], ENT_QUOTES) ; ?>" /><br />
<label for="date_naissance" class="float">Date de naissance :</label> <input type="text" name="date_naissance" id="date_naissance" size="30" value="<?php if($_SESSION['date_naissance_info'] == '') echo htmlspecialchars($_SESSION['form_date_naissance'], ENT_QUOTES) ; ?>" /> <em>(format JJ/MM/AAAA)</em><br/>
</fieldset>
<fieldset><legend>Charte du site et protection anti-robot</legend>
<?php
include('../includes/charte.php');
?>
<h1>Système anti robots :</h1>
<p>Qu'est-ce que c'est ?<br/>
Pour lutter contre l'inscription non désirée de robots qui publient du contenu non désiré sur les sites web,
nous avons décidé de mettre en place un systèle de sécurité.<br/>
Aucun de ces systèmes n'est parfait, mais nous espérons que celui-ci, sans vous être inaccessible sera suffisant
pour lutter contre ces robots.<br/>
Il est possible que certaine fois, l'image soit trop dure à lire, le cas échéant, actualisez la page jusqu'à avoir une image lisible.<br/>
Si vous êtes dans l'incapacité de lire plusieurs images d'affilée, <a href="../contact.php">contactez-nous</a>, nous nous occuperons de votre inscription.</p>
<label for="captcha" class="float">Entrez les 8 caractères (majuscules ou chiffres) contenus dans l'image :</label> <input type="text" name="captcha" id="captcha"><br/>
<img src="captcha.php" />
</fieldset>
<div class="center"><input type="submit" value="Inscription" /></div>
</form>
</div>
|
Voilà, c'était pas bien dur.
Eh bien vous savez quoi ? Le traitement du formulaire est bel et bien fini, cette fois !

Bon, bon, bon...
On a déjà fait pas mal de choses, mais il faut encore envoyer un mail au membre qui vient de s'inscrire.

Pour cela, il faut avoir un serveur qui le permette ; normalement, vous n'avez rien à faire pour que la fonction marche.
Il y a un
tutoriel du SdZ qui propose d'étudier la fonction
mail
, je vous le recommande chaudement !
Cependant, on ne sait jamais : si par hasard vous voulez vérifier si vous ne pouvez pas l'activer, consultez
la documentation.
Un bon exemple de l'utilisation de la fonction
mail
est fait dans
ce tutoriel.
Nous allons ici étudier cette fonction et certaines de ses possibilités.
Comme nous le dit la
documentation PHP, la fonction
mail()
se décrit ainsi :
Citation : Docbool mail(string $to, string $subject, string $message[, string $additional_headers[, string $additional_parameters]])
Elle prend donc en paramètre obligatoire un destinataire (surpris ?

), un sujet, un message, et c'est tout.
Code : PHP1
2
3
4
5
6
7 | <?php
$to = 'neoterranos@siteduzero.com'; //je m'y crois un peu trop, moi o_O
$subject = 'Merci !!';
$message = 'Merci le SdZ. :)';
mail($to, $subject, $message); //marche
?>
|
Ce petit bout de code marche sans soucis, mais évitez de le faire : vous n'aurez jamais de réponse.
Cependant, la fonction
mail
telle quelle n'est pas terrible.
Le message est restreint : en effet, on ne peut envoyer que des textes contenant 70 caractères par ligne, chaque ligne étant séparée par un
\n
.
Il y a de plus une histoire avec les . dans le message...
Bref, avec la fonction
mail
,
on ne peut rien faire...
Heureusement qu'il y a des headers

(en fait, on peut faire des choses avec
mail
, mais c'est mieux de passer outre les impositions vraiment lourdes).
En effet, en paramètre additionnel (donc facultatif), vous pouvez fournir des en-têtes.
Imaginons que, par un grand hasard, vous ayez, sans vous en rendre compte (tout cela n'est que pure coïncidence), composé ce code :
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 | <?php
$to = 'neoterranos@siteduzero.com'; //je m'y crois un peu trop, moi o_O
$subject = 'Merci !!';
$message = '<html>
<head>
<title>J\'vous kiffe de trop :D</title>
</head>
<body>
<p>Loin de moi l\'envie fortuite de vous importuner avec mes<br/>
discours aussi inutiles qu\'endormants, mais je trouve que vous êtes<br/>
tout simplement génial !!</p>
<p>I love you !! (De tout mon body).</p>
</body>
</html>';
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
// En-têtes additionnels
$headers .= 'From: "Mon super site" <contact@supersite.com>' . "\r\n";
$headers .= 'Cc: "Contact" <contact@supersite.com>' . "\r\n";
$headers .= 'Bcc: "Contact" <contact@supersite.com>' . "\r\n";
$headers .= 'Reply-To: "Members" <membres@supersite.com>' . "\r\n";
$mail = mail($to, $subject, $message, $headers); //marche
if($mail) echo 'ok';
else echo 'erreur.';
?>
|
Eh bien certes vous enverrez un mail ridicule et personne ne le lira, mais normalement, il arrivera en un seul morceau.
Oh my god, on peut envoyer des mails en HTML !!
En effet, la fonction
mail
peut formater des mails en HTML, c'est ce qui va nous servir par la suite ; avec cette fonction, vous pourrez même faire de la mise en forme, envoyer des pièces jointes (images, etc.), vous donnerez ainsi des rendus agréables à lire.
Nous ici, on veut envoyer un mail à notre cher inscrit.
Il faut donc créer une fonction
inscription_mail()
, elle sera très basique, mais en partie II, nous vous proposerons d'envoyer des pièces jointes avec les mails, pour faire des belles newsletters comme le SdZ en fait.
Sans plus attendre :
Code : PHP1
2
3
4
5
6 | <?php
function inscription_mail($mail, $pseudo, $passe)
{
$to = $mail;
$subject = 'Inscription sur '.TITRESITE.' - '.$pseudo;
?>
|
On définit le message.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | <?php
$message = '<html>
<head>
<title></title>
</head>
<body>
<div>Bienvenue sur '.TITRESITE.' !<br/>
Vous avez complété une inscription avec le pseudo
'.htmlspecialchars($pseudo, ENT_QUOTES).' à l\'instant.<br/>
Votre mot de passe est : '.htmlspecialchars($passe, ENT_QUOTES).'.<br/>
Veillez à le garder secret et à ne pas l\'oublier.<br/><br/>
En vous remerciant.<br/><br/>
Moi - Wembaster de '.TITRESITE.'
</body>
</html>';
?>
|
Ensuite viennent les headers additionnels (cherchez avant de lire le code) :
Secret (cliquez pour afficher)Code : PHP1
2
3
4
5
6
7
8
9 | <?php
//headers principaux.
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
//headers supplémentaires
$headers .= 'From: "Mon super site" <contact@supersite.com>' . "\r\n";
$headers .= 'Cc: "Duplicata" <duplicata@supersite.com>' . "\r\n";
$headers .= 'Reply-To: "Membres" <membres@supersite.com>' . "\r\n";
?>
|
Enfin, l'envoi (idem, facile).
Secret (cliquez pour afficher)Code : PHP1
2
3
4
5
6
7 | <?php
$mail = mail($to, $subject, $message, $headers); //marche
if($mail) return true;
return false;
}
?>
|
Notre fonction est fin prête.
Il ne reste plus qu'à l'implémenter dans
trait_inscription.php.

Je vous laisse faire.
Secret (cliquez pour afficher)Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | <?php
if(mysql_query($insertion))
{
if(inscription_mail($mail, $pseudo, $mdp)) $sent = 'Un mail de confirmation vous a été envoyé.';
else $sent = 'Un mail de confirmation devait être envoyé, mais son envoi a échoué, vous êtes cependant bien inscrit.';
vidersession();
$_SESSION['inscrit'] = $pseudo;
/*informe qu'il s'est déjà inscrit s'il actualise, si son navigateur
bugue avant l'affichage de la page et qu'il recharge la page, etc.*/
?>
<h1>Inscription validée !</h1>
<p>Nous vous remercions de vous être inscrit sur notre site, votre inscription a été validée !<br/>
Vous pouvez vous connecter avec vos identifiants <a href="connexion.php">ici</a><br/>.
<?php echo $sent; ?>
|
On crée une variable
sent
qui contient le statut d'envoi ; si tout est bon, on affiche un message informatif, sinon on affiche une erreur (qui n'annule pas l'inscription).
Voilà : le plus dur dans la fonction
mail
, c'est de comprendre comment elle marche ; le reste, c'est du gâteau.
Pfiou, l'inscription est enfin finie...
J'espère que vous êtes contents de vous.
