[Plan du site]
Vous êtes ici ---
> Le Site du Zéro
> Les tutoriels
> Non-Officiels
> Site Web
> PHP
> Systèmes complets
> Créer son forum de toutes pièces > Les pages administration > Administration Partie II
> Lecture du tutoriel
Administration Partie II
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)
Nous voici donc à la suite du long chapitre sur la page d'administration. Ici, nous allons voir la page adminok.php, qui est en fait la page de traitement des données envoyées depuis la page admin.php que l'on vient de créer... Une fois n'est pas coutume, la page de traitement est beaucoup plus courte que celle de formulaire... Autrement dit, c'est presque terminé

.
Mais bon comme j'ai dit presque... on continue.
Vous allez voir que dans cette page, on reprend le même plan que dans la précédente. Donc, on va à nouveau avoir besoin du double switch qui se présentera dans le même ordre, avec les mêmes noms de variables. D'ailleurs, si vous avez regardé les cibles des formulaires de la page admin.php, vous savez déjà tout ça.
Comme sur le chapitre précédent, je ne vais pas vous mettre le début de la page ; mais n'oubliez surtout pas de restreindre son accès aux administrateurs. Je répète que ce n'est pas parce qu'aucun lien ne va sur la page qu'il faut négliger sa sécurité !
On va commencer tout de suite avec la configuration du forum : le code n'a rien de compliqué et n'est pas long, mais vous allez voir que c'est la mode ici, et on ne va pas s'en plaindre

!
Donc : qu'est-ce qu'on va faire exactement ?
On reçoit de la page admin.php des données sous forme de variables
$_POST. Pour chaque case du formulaire, on a une variable qui s'obtient de la façon suivante :
$_POST[$nom_de_la_case]. On va donc les récupérer, et mettre à jour la base de données avec les nouvelles valeurs !
Mais si vous avez bien en tête la structure de la table
forum_config, vous comprenez qu'on est obligés de faire une requête dans une boucle pour tout mettre à jour... Aussi, pour diminuer un peu ce nombre, on va d'abord faire une vérification sur la valeur de ce qui est posté. Si elle est identique à celle qui se trouve dans la table, alors c'est que rien n'a changé, et il est inutile de faire une requête pour ça. C'est bon, vous me suivez ?
De toute façon, vous comprendrez sûrement mieux avec le 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 | <?
$cat = htmlspecialchars($_GET['cat']); //on récupère dans l'url la variable cat
switch($cat) //1er switch
{
case "config":
echo'<h1>Configuration du forum</h1>';
//On récupère les valeurs et le nom de chaque entrée de la table
$requete_config= mysql_query('SELECT config_nom, config_valeur FROM forum_config');
//Avec cette boucle, on va pouvoir contrôler le résultat pour voir s'il a changé
while($data_config = mysql_fetch_assoc($requete_config))
{
if ($data_config['config_valeur'] != $_POST[$data_config['config_nom']])
{
//On met ensuite à jour
$valeur = htmlspecialchars($_POST[$data_config['config_nom']]);
mysql_query("UPDATE forum_config SET config_valeur = '".$valeur."'
WHERE config_nom = '".$data_config['config_nom']."'") or die(mysql_error());
}
}
echo'<br /><br />Les nouvelles configurations ont été mises à jour !<br />
//Et le message !
Cliquez <a href="./admin.php">ici</a> pour revenir à l administration';
break;
?>
|
Voilà le code, j'espère que c'est clair à présent parce que c'est grosso modo comme cela que l'on va procéder à chaque fois.
Continuons, maintenant !
Cette partie est la plus longue, mais reste tout de même assez courte, même très courte par rapport à celles de la page admin.php

.
Création
Si vous vous souvenez, dans cette partie on peut créer soit un forum, soit une catégorie. C'est une petite variable appelée c qui fait la différence. On va donc dans un premier temps la récupérer (elle se cache quelque part dans l'url), et ensuite on va agir

.
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 | <?
case "forum":
//Ici forum
$action = htmlspecialchars($_GET['action']); //On récupère la valeur de action
switch($action) //2ème switch
{
case "creer":
//On commence par les forums
if ($_GET['c'] == "f")
{
$titre = mysql_real_escape_string($_POST['nom']);
$desc = mysql_real_escape_string($_POST['desc']);
$cat = (int) $_POST['cat'];
mysql_query("INSERT INTO forum_forum
(forum_cat_id, forum_name, forum_desc)
VALUES ('".$cat."', '".$titre."', '".$desc."')");
echo'<br /><br />Le forum a été créé !<br />
Cliquez <a href="./admin.php">ici</a> pour revenir à l administration';
}
//Puis par les catégories
elseif ($_GET['c'] == "c")
{
$titre = mysql_real_escape_string($_POST['nom']);
mysql_query("INSERT INTO forum_categorie (cat_nom)
VALUES ('".$titre."')");
echo'<p>La catégorie a été créée !<br />
Cliquez <a href="./admin.php">ici</a>
pour revenir à l administration</p>';
}
break;
?>
|
Il s'agit donc simplement de récupérer les données et de faire une requête. Juste un truc avant de continuer : vous remarquez qu'on ne modifie que 3 champs pour les forums, alors que la table
forum_forum en contient une bonne dizaine... C'est en fait parce que les autres doivent être modifiés ailleurs. Ainsi, un forum nouvellement créé se retrouvera automatiquement relégué à la dernière place de la catégorie.
Éditer
Pour l'édition, il y avait 4 cas différents ; on va bien sûr devoir en tenir compte ici aussi. Le code est donc découpé à l'aide de
if et autres
elseif, mais on va voir ça progressivement.
Édition d'un forum
Bon bah ça, c'est très simple : on récupère les infos envoyées par la page admin.php, et on met à jour la base de données.
Avant ça, il faut toutefois vérifier qu'il n'y a pas eu de problème, et que le forum à éditer existe bien.
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 | <?
case "edit":
echo'<h1>Edition d un forum</h1>';
if($_GET['e'] == "editf")
{
//Récupération d'informations
$titre = mysql_real_escape_string($_POST['nom']);
$desc = mysql_real_escape_string($_POST['desc']);
$cat = (int) $_POST['depl'];
//Vérification
$forum_existe = mysql_result(mysql_query("SELECT COUNT(*)
FROM forum_forum WHERE forum_id = '".$_POST['forum_id']."'"),0);
if ($forum_existe == 0)
exit("Le forum n existe pas</div></body></html>");
else
{
//Mise à jour
mysql_query("UPDATE forum_forum
SET forum_cat_id = '".$cat."', forum_name = '".$titre."',
forum_desc = '".$desc."'
WHERE forum_id = '".(int) $_POST['forum_id']."'");
//Message
echo'<p>Le forum a été modifié !<br />
Cliquez <a href="./admin.php">ici</a>
pour revenir à l administration</p>';
}
}
?>
|
Pas grand-chose à ajouter... Vous pouvez, si vous le souhaitez, permettre l'utilisation du bbcode sur les descriptions des forums. Dans ce cas, utilisez la fonction
code. De plus, vous pouvez aussi limiter la taille des descriptions pour éviter des textes trop longs.
Édition d'une catégorie
Encore plus facile, puisqu'il n'y a que le nom à mettre à jour. Du coup, c'est le même schéma, mais en plus court !
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 | <?
elseif($_GET['e'] == "editc")
{
//Récupération d'informations
$titre = mysql_real_escape_string($_POST['nom']);
//Vérification
$cat_existe = mysql_result(mysql_query("SELECT COUNT(*)
FROM forum_categorie WHERE cat_id = '".(int) $_POST['cat']."'"),0);
if ($cat_existe == 0) exit("La catégorie n existe pas");
else
{
//Mise à jour
mysql_query("UPDATE forum_categorie
SET cat_nom = '".$titre."'
WHERE cat_id = '".(int) $_POST['cat']."'");
//Message
echo'<p>La catégorie a été modifiée !<br />
Cliquez <a href="./admin.php">ici</a>
pour revenir à l administration</p>';
}
}
?>
|
Ici aussi, vous pouvez limiter la taille du nom de la catégorie, mais à vrai dire, je vois mal comment celui-ci pourrait être très long

.
Modification de l'ordre des forums
Voilà qui devient un peu plus intéressant

: je vous rappelle que dans la page admin.php, on avait créé un formulaire qui associait à chaque forum son numéro d'ordre ; il va donc falloir mettre les éventuelles modifications à jour dans la base de données.
Pour cela, on est obligés de faire une requête dans une boucle... Cependant, pour limiter un peu le nombre des requêtes, on vérifie d'abord si l'ordre a effectivement changé.
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 | <?
elseif($_GET['e'] == "ordref")
{
//On récupère les id et l'ordre de tous les forums
$requete_forum = mysql_query('SELECT forum_id, forum_ordre
FROM forum_forum');
//On boucle les résultats
while($data= mysql_fetch_assoc($requete_forum))
{
$ordre = (int) $_POST[$data['forum_id']];
//Si et seulement si l'ordre est différent de l'ancien, on le met à jour
if ($data['forum_ordre'] != $ordre)
{
mysql_query("UPDATE forum_forum SET forum_ordre = '".$ordre."'
WHERE forum_id = '".$data['forum_id']."'");
}
}
//Message
echo'<p>L ordre a été modifié !<br />
Cliquez <a href="./admin.php">ici</a>
pour revenir à l administration</p>';
}
?>
|
Si vous ne comprenez pas le
Code : PHP1 | <? $ordre = (int) $_POST[$data['forum_id']] ?>
|
c'est en rapport avec la page admin.php, la valeur des ordres s'obtient en faisant
$_POST['id_du_forum'].
Changer l'ordre des catégories
Assez similaire : on va encore une fois faire une requête dans la boucle, qu'on limitera un peu avec la condition qui vérifie si l'ordre a bien changé avant de le mettre à jour.
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 | <?
elseif($_GET['e'] == "ordrec")
{
//On récupère les id et les ordres de toutes les catégories
$requete_cat = mysql_query('SELECT cat_id, cat_ordre
FROM forum_categorie');
//On boucle le tout
while($data = mysql_fetch_assoc($requete_cat))
{
$ordre = (int) $_POST[$data['cat_id']];
//On met à jour si l'ordre a changé
if($data['cat_ordre'] != $ordre)
{
mysql_query("UPDATE forum_categorie SET cat_ordre = '".$ordre."'
WHERE cat_id = '".$data['cat_id']."'");
}
}
echo'<p>L ordre a été modifié !<br />
Cliquez <a href="./admin.php">ici</a>
pour revenir à l administration</p>';
}
break;
?>
|
Les droits
Pour les droits du forum, il faut récupérer les données pour 5 variables,
auth_view,
auth_post,
auth_topic, etc. En clair, toutes les variables qui vont servir à remplir les champs qui ont un rapport avec les autorisations.
Heureusement pour nous, le travail a été mâché dans la page précédente ; il ne restera plus qu'à faire comme ceci pour obtenir la valeur de la variable que l'on cherche :
Code : PHP1
2 | <?
$auth_view = (int) $_POST['auth_view']; ?>
|
Voici alors le 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 | <?
case "droits":
//Récupération d'informations
$auth_view = (int) $_POST['auth_view'];
$auth_post = (int) $_POST['auth_post'];
$auth_topic = (int) $_POST['auth_topic'];
$auth_annonce = (int) $_POST['auth_annonce'];
$auth_modo = (int) $_POST['auth_modo'];
//Mise à jour
mysql_query("UPDATE forum_forum
SET auth_view = '".$auth_view."',
auth_post = '".$auth_post."', auth_topic = '".$auth_topic."',
auth_annonce = '".$auth_annonce."', auth_modo = '".$auth_modo."'
WHERE forum_id = '".(int) $_POST['forum_id']."'");
//Message
echo'<p>Les droits ont été modifiés !<br />
Cliquez <a href="./admin.php">ici</a>
pour revenir à l administration</p>';
break;
}
break;
?>
|
Rien de bien compliqué donc, et du coup la partie forum est achevée. Il ne nous reste plus qu'à nous occuper des membres, et ça sera enfin terminé

.
Allez : un dernier effort, et on est arrivés

.On va s'occuper ici du traitement des informations envoyées par la page admin.php et concernant les membres.
Édition du profil
Bon : ça commence vraiment tranquillement pour nous, l'édition du profil d'un membre est une pure copie de la page modifprofil.php (vous vous souvenez, la page sur la modification du profil par un membre). Il y a deux différences majeures.
La première est que vous devez permettre aux administrateurs,
et seulement aux administrateurs d'accéder à cette page.
La seconde est que cette fois, la modification du pseudo doit être prise en compte.
Je vous laisse faire cette partie du code seuls ; vous ne devriez pas rencontrer trop de difficultés... D'ailleurs, dans ma grande bonté, je vais vous écrire la partie qui concerne le pseudo :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | <?
//Le pseudo doit être unique !
//Il faut donc vérifier s'il a été modifié, si c'est le cas, on vérifie bien
//l'unicité
$requete1 = mysql_query('SELECT membre_pseudo FROM forum_membres
WHERE membre_id = '.$pseudo.'');
$data1 = mysql_fetch_assoc($requete1);
if (strtolower($data1['membre_pseudo']) != strtolower($_POST['pseudo']))
{
$nombrepseudo= mysql_result(mysql_query("SELECT COUNT(*)
FROM forum_membres
WHERE membre_pseudo = '".stripslashes(htmlspecialchars($_POST['pseudo'])."'"), 0);
if ($nombrepseudo!= 0)
{
$pseudo_erreur1 = "Votre pseudo est déjà utilisé par un membre";
$i++;
}
}
?>
|
Pensez aussi à vérifier la longueur du pseudo par rapport aux variables fixées dans la table
forum_config... Ça fera une première utilisation pour ce système.
N'oubliez pas de mettre le case "membres": avant votre script.
Les droits du membre
Cette partie va sûrement vous réjouir, car le script est très court, mais alors vraiment très court. En fait, il suffit de récupérer la valeur du pseudo, passée par un champ caché, et la valeur du rang qui est, elle, passée par la liste déroulante.
Ensuite, on met à jour la base de données, et au final ça donne cela :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11 | <?
case "droits":
$membre = mysql_real_escape_string($_POST['pseudo']);
$rang = (int) $_POST['droits'];
mysql_query("UPDATE forum_membres SET membre_rang = '".$rang."'
WHERE membre_pseudo = '".$membre."'");
echo'<p>Le niveau du membre a été modifié !<br />
Cliquez <a href="./admin.php">ici</a>
pour revenir à l administration</p>';
break;
?>
|
Vous pouvez donc maintenant vous amuser à promouvoir de nouveaux administrateurs, des modérateurs ou encore à bannir des membres... Remarquez qu'on va voir tout de suite une méthode plus efficace.
Le bannissement
On arrive au bannissement : dernière étape, mais aussi la plus délicate (encore que ça reste acceptable) de la partie membre.
Je rappelle qu'ici on peut à la fois bannir
et débannir des utilisateurs. Il faut donc prendre en compte ces deux aspects.
Donc, on s'occupe dans un premier temps de récupérer le pseudo du membre prêt à être banni, on vérifie qu'il existe et on met à jour son rang à 0.
Ensuite, on récupère les id des membres prêts à être débannis, et on met leur rang à 2. Ils deviendront alors de simples membres ; pour changer à nouveau leur rang, vous savez comment faire, maintenant

.
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 | <?
case "ban":
//Bannissement dans un premier temps
//Si jamais on n'a pas laissé vide le champ pour le pseudo
if (isset($_POST['membre']) AND !empty($_POST['membre']))
{
$pseudo = mysql_real_escape_string($_POST['membre']);
$requete_membre = mysql_query('SELECT membre_id
FROM forum_membres WHERE membre_pseudo = "'.$pseudo.'"');
//Si le membre existe
if ($data_membre = mysql_fetch_assoc($requete_membre))
{
//On le bannit
mysql_query("UPDATE forum_membres SET membre_rang = 0
WHERE membre_id = '".$data_membre['membre_id']."'");
echo'<br /><br />Le membre '.stripslashes(htmlspecialchars($pseudo)).' a bien été banni !<br />';
}
else
{
echo'<p>Désolé, le membre '.stripslashes(htmlspecialchars($pseudo)).' n existe pas !
<br />
Cliquez <a href="./admin.php?cat=membres&action=ban">ici</a>
pour réessayer</p>';
}
}
//Debannissement ici
$requete_deban = mysql_query('SELECT membre_id FROM forum_membres
WHERE membre_rang = 0');
//Si on veut débannir au moins un membre
if (mysql_num_rows($requete_deban) > 0)
{
$i=0;
while($data_deban = mysql_fetch_assoc($requete_deban))
{
if(isset($_POST[$data_deban['membre_id']]))
{
$i++;
//On remet son rang à 2
mysql_query("UPDATE forum_membres SET membre_rang = 2
WHERE membre_id = '".$data_deban['membre_id']."'");
}
}
if ($i!=0)
echo'<p>Les membres ont été débannis<br />
Cliquez <a href="./admin.php">ici</a> pour retourner à
l administration</p>';
}
break;
?>
|
Code un peu plus long, certes, mais pas bien compliqué : en fait, il faut simplement faire gaffe à ne pas mélanger les deux cas. Le script a été bien commenté, et je ne pense pas qu'il pose de problèmes de compréhension. Si jamais c'est le cas, regardez à nouveau la page admin.php, et ne continuez que lorsque c'est assimilé.
Bon bah, comme on dit, ça, c'est fait

. La partie administration est mise en place... Ça fait certes des pages assez longues et plutôt indigestes, c'est pourquoi je vous conseille de séparer chaque cas en le mettant dans une page à part, que vous inclurez grâce à la fonction
include.
Après, c'est à vous de voir.
Avant de vous laisser vous éclater avec le panneau d'admin, j'aimerais vous lancer sur quelques pistes pour améliorer un peu ces pages, et les compléter avec plus d'options.
- Permettre de supprimer un forum.
- Déplacer tout le contenu d'un forum vers un autre :
cette option est pratique, et en même temps assez simple : il vous suffit en effet de modifier la valeur de post_forum, topic_forum, forum_post, forum_topic. Le tout peut être fait en 3 ou 4 requêtes.
Allez ! Sur ces belles paroles, je vous laisse à votre forum, et je vous donne rendez-vous dans la partie suivante du tuto pour voir ensemble des options sympas à ajouter au forum (système de lu / non-lu, par exemple

).