Je n'ai pas voulu appelé cette partie FAQ car ça n'en est pas une et en plus j'ai l'esprit de contradiction

.
Je vais simplement donner des indications sous forme de questions/réponses en basant le tout sur ce que j'ai pu lire par-ci par-là.
Espace membre
La plupart d'entre vous essaye de coder son forum dans le but de rassembler une communauté qui visite votre site.
Donc la plupart du temps vous souhaitez que les sessions du forum restent en vigueur sur votre site.
Ca peut paraitre un non problème pour certains mais je vous garantis que j'ai reçu plusieurs demandes dans ce style.
Et bien voici la solution, qui est d'ailleurs assez automatique et simple, il suffit basiquement de faire usage de la table
forum_membres ainsi que des variables de sessions.
Petit rappel pour ceux qui ont oublié :
Obtenir le pseudo :
$_SESSION['pseudo']
Obtenir l'id :
$_SESSION['id']
Obtenir le rang (modérateur, administrateur...) :
$_SESSION['level']
A partir de là tout ce dont vous aurez besoin ce trouve dans la table
forum_membres.
Je vois pas trop quoi dire de plus... Si vous voulez mettre la page de connexion et d'inscription sur votre site ça ne pose évidemment aucun problème à condition de vérifier 2 ou 3 liens.
Mise en forme
La pagination
Lorsque l'on créer un forum, un problème souvent rencontré est qu'on ne se soucie pas en premier lieu des conséquences d'une grosse affluence.
L'exemple le plus frappant est la pagination, dans mon tuto je n'ai fait qu'afficher toutes les pages. Mais imaginez un peu un topic avec 20 pages, on aurait droit à quelque chose comme ça :
Citation : voirtopic.php1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
(Oui je me suis amusé à tout recopier

).
Vous conviendrez que ce n'est pas très pratique, et je vous laisse imaginer l'horreur s'il y a 100 pages, 1000 pages ?
C'est pour celà qu'on va modifier tout ça grâce à une fonction que j'ai trouvé sur le SDZ et dont l'auteur est
Winzou.
Le rendu est beaucoup plus agréable car en cas de topic de 20 pages, si l'on se trouve sur la page 10 on lira.
Citation : voirtopic.php1 2 ... 8 9 10 11 12 ... 18 19 20
Sympa non ?
J'ai légèrement modifié la fonction pour qu'elle concorde avec nos scripts.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | <?
//Fonction listant les pages
function get_list_page($page, $nb_page, $link, $nb = 2){
$list_page = array();
for ($i=1; $i <= $nb_page; $i++){
if (($i < $nb) OR ($i > $nb_page - $nb) OR (($i < $page + $nb) AND ($i > $page -$nb)))
$list_page[] = ($i==$page)?'<strong>'.$i.'</strong>':'<a href="'.$link.'&page='.$i.'">'.$i.'</a>';
else{
if ($i >= $nb AND $i <= $page - $nb)
$i = $page - $nb;
elseif ($i >= $page + $nb AND $i <= $nb_page - $nb)
$i = $nb_page - $nb;
$list_page[] = '...';
}
}
$print= implode('-', $list_page);
return $print;
}
?>
|
Vous pouvez mettre ce code avec les autres fonctions pour s'assurer qu'il sera bien sur les pages voirtopic.php et voirforum.php ainsi que sur la liste des membres, bref à n'importe quel endroit où vous souhaitez lister des pages, enfin vous savez faire ça maintenant.
Pour ce qui est de son fonctionnement, quelques explications :
La fonction prend 3 paramètres obligatoires et 1 paramètre optionnel, le premier est le numéro de la page actuel, le second est le nombre de page, jusque là pas de soucis.
Pour le troisième il s'agit en fait du début de la page sur laquelle vous vous trouvez, on verra un exemple plus tard mais en gros si vous êtes sur la page voirtopic.php, vous voulez que les liens pointent vers cette même page donc on doit donner cette information.
Enfin le paramètre optionnel est le nombre de pages à afficher autours de la page actuel (genre si on est page 10, on veut afficher 8,9 et 11,12).
Concernant le php, il n'y a pas grand chose à dire, la fonction va entrer les pages à afficher dans un tableau nommé
$list_page, pour transformer ce tableau en une chaine de caractère on utilise la fonction
implode qui va au passage ajouter des - entre les numéros.
Allez hop un petit exemple bien senti pour mieux comprendre, celui de la page
voirtopic.php.
Avant on avait :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | <?
echo '<p>Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
if ($i == $page) //On affiche pas la page actuelle en lien
{
echo' <strong>'.$i.'</strong> ';
}
else
{
echo '<a href="voirtopic.php?t='.$topic.'&page='.$i.'">' . $i . '</a> ';
}
}
echo'</p>';
?>
|
Et maintenant on aura
Code : PHP | <?php
echo '<p>Page : ';
echo get_list_page($page, $nombreDePages, './voirtopic.php?t='.$topic);
echo'</p>';
?>
|
Et en plus ça prend moins de place !
Vous remarquerez que pour le lien on ne met pas tout puisque c'est la fonction qui va se charger de le compléter (parce qu'on a besoin de mettre le numéro de la page dans l'url ce qu'on ne peut pas faire directement). Prudence donc...
Les configurations
Lors du chapitre sur la page d'administration, je vous avais un peu laissé seul avec une phrase mystérieuse vous invitant à utiliser les valeurs de la table
forum_config dans tout le forum, par exemple pour définir la taille minimale du pseudo.
Voici quelques informations supplémentaires pour vous guider, je ne voulais pas les mettre sur le chapitre concerné car il est déjà très lourd d'une part et d'autre part parce que ça vous laissez un peu gérer ça comme vous le souhaitiez.
Néanmoins il s'est avéré que certains ne savaient pas quoi faire, donc voilà ma méthode, il y en a d'autres, si vous aviez déjà un système fonctionnel inutile de changer quoique ce soit.
L'idée est de récupérer les variables de configuration et de tout mettre dans un tableau appelé
$config. Pour mémoire, la table
forum_config est organisé en 2 champs,
config_nom et
config_valeur, il suffira donc de faire
$config['nom de la config'] pour accéder à sa valeur.
Il suffit donc de remplir un petit tableau sur chaque page, donc pour cela il faut utiliser la page
debut.php.
Code : PHP | <?php
//Récupération des variables de configuration
$query = $db->query('SELECT * FROM forum_config');
$config = array();
while($data=$query->fetch())
{
$config[$data['config_nom']] = $data['config_valeur'];
}
$query->CloseCursor();
?>
|
Voilà le travail, et pour finir un petit exemple :
Toujours sur la page
voirtopic.php vous aviez au moment de compter le nombre de page un truc dans ce style :
Code : PHP | <?php
$totalDesMessages = $data['topic_post'] +1;
$nombreDeMessagesParPage = 15;
$nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage);
?>
|
il suffit de remplacer le 15 par
$config['post_par_page'] et vous pourrez alors modifier cette valeur directement via le panneau d'administration

.
Avant de passe à la suite, je vais donner une liste en vrac des valeurs configurables depuis le panneau d'administration de cette manière :
- Le nombre de topics/posts par page
- La longueur/largeur max de l'avatar ainsi que son poids max
- Le titre du forum (qui apparait en gros sur la page d'index
- L'intervalle entre deux actions (contrôle anti flood, voir plus bas
)
- La durée à partir de laquelle on affiche l'utilisateur en ligne (pour le système qui est en ligne, on avait pris 5 minutes)
- Autorisation du bbcode dans les messages/signatures
- Taille maximale de la signature/du pseudo et taille minimale du pseudo
En gros il ne doit plus rester un seul chiffre dans tout vos codes

. Bien évidemment vous pouvez ajouter autant de champ que vous le désirez !
Afficher le nombre de messages non-lus
Comme sur le SDZ, je pense que beaucoup préfère que le nombre de messages privés reçu apparaisse sur la page d'accueil ou du moins dans un menu pour éviter d'avoir à vérifier à chaque fois.
Il suffit tout bonnement d'utiliser le champ
mp_lu de la table
forum_mp, placez une requête de ce style :
Code : PHP | <?php
$query=$db->prepare('SELECT COUNT(*) FROM forum_mp WHERE mp_receveur = :id AND mp_lu = :lu');
$query->bindValue('id',$id,PDO::PARAM_INT);
$query->bindValue(':lu','0', PDO::PARAM_STR);
$query->execute();
$nbr_lu=$query->fetchColumn();
$query->CloseCursor();
?>
|
Avec
$id l'id du membre (bien sûr il ne faut afficher cette requête que lorsque le visiteur est connecté, sinon il n'y a pas de mp...
La sécurité
Système anti-flood
La sécurité anti flood permet d'éviter qu'un membre appuie sur raffraichir une fois sur la page de validation d'un message et qu'il en envoie ainsi une dizaine. Cette action peut être volontaire dans le cas d'un spam ou tout simplement accidentelle, c'est pourquoi il faut lutter contre.
Pour continuer le parallèle avec le SDZ, le système du SDZ est plus perfectionné, puisqu'il est possible de poster autant que l'on souhaite mais si on veut poster deux messages de suite sur le même topic, on doit attendre 24h.
Ce que l'on va faire c'est simplement au moment de valider le message d'un utilisateur, vérifier que le dernier message de l'utilisateur en question remonte a au moins x secondes. Pour le x vous pouvez entrer ce que vous voulez (10s, 15s, 20s), au delà ça devient assez pénible pour les gens postant des messages courts, de toute façon un spammeur ne va pas s'amuser à attendre 20 secondes entre deux posts, ça va vite le gonfler

.
Voici donc le code à placer sur la page
postok.php
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12 | <?
//Contrôle anti flood
$nombre_mess = mysql_result(mysql_query('SELECT COUNT(*) FROM forum_post WHERE post_createur = :id AND post_time > :time');
$query->bindValue(':id',$id,PDO::PARAM_INT);
$query->bindValue(':time',time() - $config['temps_flood'],PDO::PARAM_INT);
$query->execute();
$nombre_mess=$query->fetchColumm();
if ($nombre_mess !=0)
{
erreur(ERR_FLOOD);
}
?>
|
$config['temps_flood'] contient la valeur de la durée en secondes minimales entre deux actions.
Bien sur il faudra penser à mettre ce code à 2 endroits (pour les réponses et pour les nouveaux topics).
Pour l'erreur ERR_FLOOD, vous pouvez écrire quelque chose comme
Code : PHP | <?php
define('ERR_FLOOD','Contrôle anti flood, vous ne pouvez poster que toutes les '.$config['temps_flood'].' sec.<br />
Veuillez attendre un moment puis recommencer');
?>
|
Le forum est-il fiable ?
Une question qu'on m'a posé (très) souvent et qui est largement légitime mais dont il est difficile d'apporter une réponse claire.
Les dernières modifications apportées au tuto ont permis d'en améliorer la sécurité en suivant un schéma simple :
L'utilisation de la fonction
bindValue et de la PDO permet de limiter les risques d'injection SQL.
stripslashes(htmlspecialchars()) est utilisé lors de l'affichage de cette variable.
Enfin on utilise
intval() pour les données chiffrées et simplement
htmlspecialchars() pour afficher simplement une variable qui ne provient pas de la base de données (formulaire ou variable $_GET par exemple).
Enfin pour ceux qui ont adapté le système de cookie il ne faut surtout pas oublier la vérification par le mot de passe.
Le mieux serait d'entrer le mot de passe dans un cookie lors de la connexion et de faire la vérification avant de créer la variable de session, sinon n'importe qui pourra se connecter en changeant ses cookies ce qui est carrément gênant surtout s'il prend le compte d'un admin...
Finalement c'est assez simple mais si vous respectez cette méthode vous n'aurez à priori pas de problème de failles.