Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
On en arrive au chapitre 4, et l'air de rien, notre forum commence à prendre forme. Bien sûr, pour l'instant on ne peut pas l'utiliser : mais bon, on peut déjà s'y inscrire. Et d'ailleurs, lorsqu'un membre s'inscrit, un formulaire lui demande de renseigner pas mal de choses, comme son adresse MSN ou sa localisation ; on ne fait pas vraiment ça juste pour lui faire remplir plus de champs, mais pour pouvoir créer une fiche de renseignements à son sujet. Cette fiche (ou profil), on va voir en détail comment la faire.
Allez, au boulot

.
La première des deux options est à la fois la plus simple à réaliser et la plus utilisée. Il s'agit simplement d'afficher les informations au sujet d'un membre sur une page.
Les variables
L'url de cette page est
voirprofil.php ; cela dit, il nous faut connaitre l'id du membre dont on veut lire le profil, ainsi que l'action que l'on souhaite exécuter sur cette page (modifier ou consulter).
Donc on a besoin de deux variables : ainsi, l'adresse du profil d'un membre se présentera toujours comme ceci :
/voirprofil.php?m=3&action=consulter
Normalement, il ne doit pas y avoir trop de problèmes à ce niveau. On a nos deux variables :
$_GET['m'] = 3
$_GET['action'] = consulter
Et leur valeur vont nous permettre de savoir quoi afficher.
Initialisation
Le principe de la page repose sur un
switch : on va vérifier la valeur de la variable
action, et afficher le contenu en fonction.
Page : voirprofil.php
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | <?php
//Cette fonction doit être appelée avant tout code html
session_start();
//On donne ensuite un titre à la page, puis on appelle notre fichier debut.php
$titre = "Profil";
include("includes/debut.php");
?>
<body>
<div id="banniere"></div>
<?php
//Maintenant, on se connecte à la base de données
include("includes/identifiants.php");
mysql_connect($adresse, $nom, $motdepasse);
mysql_select_db($database);
//On récupère la valeur de nos variables passées par URL
$action = htmlspecialchars($_GET['action']);
$membre = (int) $_GET['m'];
?>
<div id="corps_forum">
<a href ="./index.php">Index du forum</a>
|
Rien de très différent de ce qu'on a vu dans les chapitres précédents, si ce n'est qu'on récupère la valeur des variables qui se trouvent dans l'url.
Bien sûr, ce n'est qu'une question de clarté ; rien ne vous empêche de garder l'écriture $_GET['m'] plutôt que $membre.
Le switch
On arrive au cœur du code : voici donc la partie du script qui permet de consulter un profil :
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 | <?php
//On regarde la valeur de la variable $action
switch($action)
{
//Si c'est "consulter"
case "consulter":
//On récupère les infos du membre
$requete1 = mysql_query('SELECT membre_pseudo, membre_avatar,
membre_email, membre_msn, membre_signature, membre_siteweb, membre_post,
membre_inscrit, membre_localisation
FROM forum_membres WHERE membre_id='.$membre);
if ($data1 = mysql_fetch_assoc($requete1))
{
//On affiche les infos sur le membre
echo'<h1>Profil de '.$data1['membre_pseudo'].'</h1>';
echo'<img src="./images/avatars/'.$data1['membre_avatar'].'"
alt="Ce membre n a pas d avatar" />';
echo'<p><strong>Adresse E-Mail : </strong>
<a href="mailto:'.$data1['membre_email'].'">
'.$data1['membre_email'].'</a><br />';
echo'<strong>MSN Messenger : </strong>'.$data1['membre_msn'].'<br />';
echo'<strong>Site Web : </strong>
<a href="'.$data1['membre_siteweb'].'">'.$data1['membre_siteweb'].'</a>
<br /><br />';
echo'Ce membre est inscrit depuis le
<strong>'.date('d/m/Y',$data1['membre_inscrit']).'</strong>
et a posté <strong>'.$data1['membre_post'].'</strong> messages
<br /><br />';
echo'<strong>Localisation : </strong>'.$data1['membre_localisation'].'
</p>';
}
//Si on ne trouve pas d'info
else
{
echo'<p>Ce membre ne semble pas exister !</p>';
}
break;
|
C'est tout, vous voyez que finalement il n'y a pas grand-chose : logique, puisqu'il ne s'agit que d'afficher les infos stockées dans une base de données.
Une fois dans le
switch, on lance une requête qui va retourner tout ce qu'elle trouve sur le membre dont l'id est contenu dans la variable. Si jamais elle ne trouve rien, c'est que l'id n'est attribuée à aucun membre ; ça ne devrait pas arriver sauf si l'url a été modifiée par le visiteur. Dans ce cas, on affiche un message d'erreur.
On en arrive donc à la fin de la partie de simple visite d'un profil, et on va maintenant voir la partie modification. C'est parti

!
La partie modification du profil se fait dans le même script que la simple visite : c'est pourquoi des accolades restent ouvertes, et que la fin du code n'apparait pas.
Modification
La modification du profil ne peut être faite que par le membre concerné (c'est mieux, quand même

). On va donc devoir utiliser la variable
$_SESSION['id']. Ensuite, il suffit d'afficher
le même formulaire que celui de l'inscription, sauf que cette fois, on pré-remplit les champs avec les valeurs qu'on connaît déjà.
Page : voirprofil.php
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 | <?php
//Si on choisit de modifier son profil
case "modifier":
//On prend les infos du membre
$requete2 = mysql_query('SELECT membre_pseudo, membre_email,
membre_siteweb, membre_signature, membre_msn, membre_localisation,
membre_avatar
FROM forum_membres WHERE membre_id='.$_SESSION['id']);
if ($data2 = mysql_fetch_assoc($requete2))
{
?>
<h1>Modifier son profil</h1>
<form method="post" action="modifprofil.php" enctype="multipart/form-data">
<fieldset><legend>Identifiants</legend>
Pseudo : <?php echo'<strong>'.$data2['membre_pseudo'].'</strong>'?><br />
<label for="password">Nouveau mot de Passe :</label>
<input type="password" name="password" id="password" /><br />
<label for="confirm">Confirmer le mot de passe :</label>
<input type="password" name="confirm" id="confirm" />
</fieldset>
<fieldset><legend>Contacts</legend>
<label for="email">Votre adresse E_Mail :</label>
<input type="text" name="email" id="email"
value="<?php echo $data2['membre_email'] ?>" /><br />
<label for="msn">Votre adresse MSN :</label>
<input type="text" name="msn" id="msn"
value="<?php echo $data2['membre_msn'] ?>" /><br />
<label for="website">Votre site web :</label>
<input type="text" name="website" id="website"
value="<?php echo $data2['membre_siteweb'] ?>" /><br />
</fieldset>
<fieldset><legend>Informations supplémentaire</legend>
<label for="localisation">Localisation :</label>
<input type="text" name="localisation" id="localisation"
value="<?php echo $data2['membre_localisation'] ?>" /><br />
</fieldset>
<fieldset><legend>Profil sur le forum</legend>
<label for="avatar">Changer votre avatar :</label>
<input type="file" name="avatar" id="avatar" />
(Taille max : 10 ko)<br /><br />
<label><input type="checkbox" name="delete" value="Delete" />
Supprimer l avatar</label>
Avatar actuel :
<?php echo'
<img src="./images/avatars/'.$data2['membre_avatar'].'"
alt="pas d avatar" />' ?>
<br /><br />
<label for="signature">Signature :</label>
<textarea cols="40" rows="4" name="signature" id="signature">
<?php echo $data2['membre_signature'] ?></textarea>
</fieldset>
<p>
<input type="submit" value="Modifier son profil" />
</p></form>
<?php
}
else echo'<p>Une erreur s est produite, veuillez réessayer</p>';
break;
default; //Si jamais c'est aucun de ceux là c'est qu'il y a eu un problème :o
echo'<p>Cette action est impossible</p>';
} //Fin du switch
mysql_close();
?>
</body>
</html>
|
J'ai tout mis d'un coup, car de toute façon ce code, vous le connaissez déjà. Il en sera de même pour la page
modifprofil.php qui est l'identique de registerok.php, en remplaçant les
INSERT INTO par des
UPDATE.
Pour éviter que n'importe qui ne modifie le profil des autres, on ne peut accéder à cette page que grâce à la variable de session
$_SESSION['id']. Celle-ci permet de retourner des infos uniquement sur le membre qui visite la page.
Encore une chose : pour que ça ne devienne pas ingérable, un membre ne peut pas en général modifier son pseudo, c'est aux administrateurs de s'en charger. C'est pourquoi il n'y a pas de champ pseudo dans cette page.
Traitement
On passe donc ici à la page
modifprofil.php : je vous conseille de garder sous la main la page registerok.php si vous n'avez pas la méthode utilisée bien en tête.
On débute sans plus attendre :
Page : modifprofil.php
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 | <?php
//Cette fonction doit être appelée avant tout code html
session_start();
//On donne ensuite un titre à la page, puis on appelle notre fichier debut.php
$titre = "Modification du profil";
include("includes/debut.php");
?>
<body>
<div id="banniere"></div>
<?php
//Maintenant, on se connecte à la base de données
include("includes/identifiants.php");
mysql_connect($adresse, $nom, $motdepasse);
mysql_select_db($database);
//Encore est toujours notre belle variable $i :p
$i = 0;
//Vérification du mdp
if ($_POST['password'] != $_POST['confirm'] || empty($_POST['confirm']) || empty($_POST['password']))
{
$mdp_erreur = "Votre mot de passe et votre confirmation diffèrent ou sont vides";
$i++;
}
//Vérification de l'adresse email
//Il faut que l'adresse email n'ait jamais été utilisée (sauf si elle n'a pas été modifiée)
$requete1 = mysql_query('SELECT membre_email FROM forum_membres WHERE membre_id = '.$_SESSION['id'].'');
$data1 = mysql_fetch_assoc($requete1);
if (strtolower($data1['membre_email']) != strtolower($_POST['email']))
{
$nombremail = mysql_result(mysql_query("SELECT COUNT(*) FROM forum_membres WHERE membre_email = '".$_POST['email']."'"), 0);
if ($nombremail!= 0)
{
$email_erreur1 = "Votre adresse email est déjà utilisée par un membre";
$i++;
}
//On vérifie la forme maintenant
if (!preg_match("#^[a-z0-9A-Z._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['email']) || empty($_POST['email']))
{
$email_erreur2 = "Votre nouvelle adresse E-Mail n'a pas un format valide";
$i++;
}
}
//Vérification de l'adrese msn
if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['msn']) && !empty($_POST['msn']))
{
$msn_erreur = "Votre nouvelle adresse MSN n'a pas un format valide";
$i++;
}
//Vérification de la signature
if (strlen($_POST['signature']) > 200)
{
$signature_erreur = "Votre nouvelle signature est trop longue";
$i++;
}
//Vérification de l'avatar
if (!empty($_FILES['avatar']['size']))
{
//On définit les variables :
$maxsize = 30072; //Poid de l'image
$maxwidth = 100; //Largeur de l'image
$maxheight = 100; //Longueur de l'image
//Liste des extensions valides
$extensions_valides = array( 'jpg' , 'jpeg' , 'gif' , 'png', 'bmp' );
if ($_FILES['avatar']['error'] > 0)
{
$avatar_erreur = "Erreur lors du tranfsert de l'avatar : ";
}
if ($_FILES['avatar']['size'] > $maxsize)
{
$i++;
$avatar_erreur1 = "Le fichier est trop gros :
(<strong>".$_FILES['avatar']['size']." Octets</strong>
contre <strong>".$maxsize." Octets</strong>)";
}
$image_sizes = getimagesize($_FILES['avatar']['tmp_name']);
if ($image_sizes[0] > $maxwidth OR $image_sizes[1] > $maxheight)
{
$i++;
$avatar_erreur2 = "Image trop large ou trop longue :
(<strong>".$image_sizes[0]."x".$image_sizes[1]."</strong> contre
<strong>".$maxwidth."x".$maxheight."</strong>)";
}
$extension_upload = strtolower(substr( strrchr($_FILES['avatar']['name'], '.') ,1));
if (!in_array($extension_upload,$extensions_valides) )
{
$i++;
$avatar_erreur3 = "Extension de l'avatar incorrecte";
}
}
?>
|
Voici pour la première partie ; tout ce j'ai changé par rapport à la page registerok.php, c'est de rajouter "nouvelle" ou "nouveau" dans les messages d'erreurs

. La seule difficulté vient du fait qu'on ne sait pas si le membre décide de modifier son adresse e-mail ou de la laisser. Du coup, on ne peut s'assurer de son unicité qu'une fois qu'on est certain qu'il l'a changée.
La suite va quand même demander un peu plus de retouches :
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 | <div id="corps_forum">
<?php
echo'<p><a href ="./index.php">Index du forum</a> /
<a href="./voirprofil.php?action=modifier">Modification du profil</a></p>';
if ($i == 0) // Si $i est vide, il n'y a pas d'erreur
{
if (!empty($_FILES['avatar']['size']))
{
//On déplace l'avatar
$avatar = time();
$nomavatar = str_replace(' ','',$avatar).".".$extension_upload;
$avatar = "./images/avatars/".str_replace(' ','',$avatar).".".$extension_upload;
move_uploaded_file($_FILES['avatar']['tmp_name'],$avatar);
mysql_query('UPDATE forum_membres
SET membre_avatar = '.$nomavatar.'
WHERE membre_id = '.$_SESSION['id']);
}
//Une nouveauté ici : on peut choisisr de supprimer l'avatar
if (isset($_POST['Delete']))
{
mysql_query('DELETE membre_avatar
FROM forum_membres WHERE membre_id = '.$_SESSION['id']);
}
echo'<h1>Modification terminée</h1>';
echo'<p>Votre profil a été modifié avec succès !</p>';
echo'<p>Cliquez <a href="./index.php">ici</a>
pour revenir à la page d accueil</p>';
//On vérifie que les champs ne contiennent pas de html
//et on crypte le mot de passe
$pass = md5($_POST['password']);
$signature = htmlentities($_POST['signature'], ENT_QUOTES);
$signature = nl2br($signature);
$email = htmlspecialchars($_POST['email'], ENT_QUOTES);
$msn = htmlspecialchars($_POST['msn'], ENT_QUOTES);
$website = htmlspecialchars($_POST['website'], ENT_QUOTES);
$localisation = htmlspecialchars($_POST['localisation'], ENT_QUOTES);
//On modifie la table
mysql_query("
UPDATE forum_membres
SET membre_mdp ='".$pass."' , membre_email = '".$email."' ,
membre_msn = '".$msn."' , membre_siteweb = '".$website."',
membre_signature = '".$signature."' ,
membre_localisation = '".$localisation."'
WHERE membre_id = '".$_SESSION['id']."'") or die (mysql_error());
//Et on définit de nouvelles variables de sesssion
//Pour celà on a besoin de la bdd
$requete = mysql_query('
SELECT membre_id, membre_rang
FROM forum_membres
WHERE membre_id = '.$_SESSION['id']);
if ($data = mysql_fetch_assoc($requete))
{
$_SESSION['id'] = $data['membre_id'];
$_SESSION['level'] = $data['membre_rang'];
}
}
else
{
echo'<h1>Modification interrompue</h1>';
echo'<p>Une ou plusieurs erreurs se sont produites pendant la modification du profil</p>';
echo'<p>'.$i.' erreur(s)</p>';
echo'<p>'.$mdp_erreur.'</p>';
echo'<p>'.$email_erreur1.'</p>';
echo'<p>'.$email_erreur2.'</p>';
echo'<p>'.$msn_erreur.'</p>';
echo'<p>'.$signature_erreur.'</p>';
echo'<p>'.$avatar_erreur.'</p>';
echo'<p>'.$avatar_erreur1.'</p>';
echo'<p>'.$avatar_erreur2.'</p>';
echo'<p>'.$avatar_erreur3.'</p>';
echo'<p> Cliquez
<a href="./voirprofil.php?action=modifier">ici</a> pour recommencer</p>';
}
?>
</div>
</body>
</html>
|
Je mets tout le code d'un coup, car vous avez vu qu'il ressemble énormément à celui de registerok.php. Une fois que ceci est fait, vous pouvez modifier votre profil comme bon vous semble.
Les pages de profils sont maintenant en place sur le forum. Tout ce qui concerne les membres est par la même occasion terminé, il ne reste plus qu'à s'intéresser aux messages

.
Juste un mot sur les profils : ce que je propose ici est comme d'habitude le plus basique possible. Si vous voulez afficher plus d'infos (âge, goûts, loisirs, etc.), ce qui peut être intéressant si votre forum est spécialisé, il vous faut ajouter des champs à votre table
forum_membres. Puis, de la même manière, les afficher sur le profil.
Allez, encore un petit effort pour attaquer la suite.