Aller au menu - Aller au contenu

Icône Annexe

Avatar
Mise à jour : 30/11/2010
4 145 visites depuis 7 jours, dont 97 sur ce chapitre classé 41/786
Je ne pouvais pas terminer ce tuto sans une petite annexe pour mettre les choses au points et en plus je suis certain que je vous ai manqué :p .
Plus sérieusement depuis plus d'un an je reçois régulièrement par MP des conseils, remarques ou demandes d'aide sur des parties compliquées.
Avec cette annexe je ne vais pas vous donner de nouvelles fonctionnalités ni de super méthode pour résoudre tout vos bugs, je vais simplement répondre à une série de questions et donner quelques suggestions.

Par ailleurs, une partie est réservée à la sécurité du tuto et vous trouverez à la fin de cette annexe une liste des forums qui ont été créé à l'aide de ce tuto afin de pouvoir comparer ou simplement avoir un aperçu des rendus possibles ;) .
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire

Questions récurrentes

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 :p .
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.php
1 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 ? o_O

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.php
1 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.'&amp;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
1
2
3
4
5
<?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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?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
1
2
3
4
5
<?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 :p )
  • 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 :p . 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
1
2
3
4
5
6
7
8
<?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
1
2
3
4
<?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.

Liste de forums

Dans cette sous partie j'aimerai donner des liens vers des forums qui se sont inspirés de près ou de loin du tuto. J'ai déjà vu un bon paquet de tels forums et beaucoup m'ont envoyé un lien pour que je le recopie.

J'invite tous les zéros désirant ajouter leur forum à m'envoyer un MP avec dans le titre [forum] et en précisant le lien et une petite description.

Quant aux autres, cette liste constituera autant d'exemples et de démonstrations que possible à partir des scripts que vous avez lu jusqu'ici.


La liste



ForumAuteurDescription
Forum exemple du tuto Tadzoa
Le forum qui a servit de support pour ce tuto, il possède à peu de choses près les mêmes script que ceux que vous avez pu voir ici
eduDZ nextrem
Forum regroupant une communauté de lycéens algériens
D3news Panzaa Forum autours de Diablo 3
Forum webmastering funnycat Forum ayant pour thématique le webmastering au sens large.
Forum Web By Nairod MisterDo Site sur l'informatique avec tutoriels, projets, forum ayant pour but le partage de connaissances
Forum Philisto thibaultg Forum sur l'histoire et la philosophie
Forum ChezGus Nikitz Un CMS dont le forum est inspiré du tuto
Forum MHQ Lucky_68 Forum créé pour un lycée
Forum Celestia Odyssey SoupeurStar Forum créé pour un MMO en ligne
Forum Tu en penses quoi ? Bat538 Le forum accompagne un site de pronostics footballistiques. Il permet aux membres (peu nombreux) de discuter des sujets sportifs divers
Forum Dofux Sw4gger Un forum sur Dofus
Forum2Geek Abmo Forum du site 2geek : Le site pour débutants où tout est expliqué à partir de Zéro ! Des créations est des tutos de tout les genres ! Des astuces pour tout le monde ...
Tera World Bacamos Forum sur le mmorpg Tera
La boite à question quentinus95 Un forum d'entraide qui parle de tout



Ajouter son forum



Pour ajouter son forum à cette liste, si votre forum est terminé et qu'il est inspiré du tuto, n'hésitez pas à m'envoyer un MP, mais n'oubliez surtout pas le [forum] devant le titre ^^
Voilà c'est tout pour cette annexe que je n'exclue pas de modifier ne serait-ce qu'avec les adresses de nouveaux forum qui j'espère seront nombreux.

Je vous souhaite une fois de plus un bon courage et un avenir radieux pour votre forum :)
Chapitre précédent Sommaire

Partager

25 commentaires pour "Annexe"
Note moyenne : 3.61 / 4 (349 votes)
Pseudo Commentaire
Hors ligne taibi # Posté le 21/05/2010 à 16:44:55

Au vu des commentaires, le tutoriel a plutot l'air assez excellent (je dis sa parce que je l'ai pas encore commencer, ce qui ne devarit plus trop tarder :) ).
J'aurais juste une toute petite question:

Dans l'annexe il y a la liste de certain qui ont développer leur forum: c'est par rapport à ce tutoriel, c'est ça? Mais le design il l'ont changé seulement sur le CSS c'est tout?

Merci
Hors ligne Enestyr # Posté le 16/06/2010 à 15:13:32
Vive le nutella -_-"
Avatar

Non, ils ont surement changé d'autres trucs.

Un GROS problème dans ce tuto : le mot de passe... il n'est pas haché dans la base de donnée. Si un pirate passe (on sait jamais) il peut être capable de tout rafler. Voir le tuto de M@teo sur le php...

Sinon, il est génialissime !

Ma vie a son secret, ma vie a son mystère... :'( C'est trop beau la poésie !
 
Hors ligne quenti77 # Posté le 25/07/2010 à 14:30:22
|Pr77|
Avatar

Avis : Très bon
Flux RSS

Ville : Roissy en brie
Pays : France métropolitaine
Études : ESGI-ICAN

Salut,
J'admire ton travail et ton dévouement. Grâce à toi j'ai réussi à créer un forum pour mon site. informa-cours

Image utilisateur

Image utilisateur
 
Hors ligne gamichan # Posté le 17/06/2011 à 00:16:35
Avatar

Bonjours a tout les Zéros,
serais t'il possible de mettre une partit avec les code entier car je me suis mélanger est.. :'(

Merci.

Pardonnez moi des faute :(
 
Hors ligne Transistored # Posté le 20/02/2012 à 12:38:35
( ! ) Parse error
Avatar

Avis : Très bon

Ville : Chartrettes
Pays : France métropolitaine

Un grand bravo pour ce tuto excellent !
Parfait en tout point , on aurait juste aimé avoir à la fin une archive avec tous les fichiers du cours ;)
Et sinon la plupart les liens des forums dans l'annexe sont inexistants :/
Merci à Tadzoa et tous ceux qui l'ont aidé !

Seul l'idiot du village ne savait pas que la chose était impossible, alors il l'a faite.
 

Voir tous les commentaires