Aller au menu - Aller au contenu

[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 membres > Poster > Lecture du tutoriel

Poster

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)
Avatar
Auteur : General Vans
Note : 17 / 20 (21 votes)
Visualisations : 24 660
Licence : Creative Commons BY


Plus d'informations Plus d'informations
Si vous avez suivi tous les chapitres jusqu'ici, vous avez dû vous rendre compte que, pour l'instant, le forum n'est qu'une coquille vide, dans la mesure où on ne peut pas poster de message. Après la lecture de cette page, ça va être chose faite. On va en effet s'occuper de la page poster.php, qui constitue par ailleurs la dernière de cette partie.

Le script de cette page ne sera pas final. On va en fait simplement voir ici comment poster un message. Plus tard, on s'occupera de savoir comment les modérateurs pourront supprimer ou éditer des messages. :o

Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Page de formulaire

Comme tous les formulaires qu'on a vus jusqu'ici, il va falloir créer deux pages : une proposant de poster un message, et une autre pour le traiter, et afficher un message d'erreur.

On va, dans un premier temps, voir la page de formulaire.

Il faut bien définir deux cas bien distincts dans le script de la page poster.php : on peut vouloir poster un nouveau message ou un nouveau topic. Dans le premier cas, il s'agit simplement de répondre à un sujet déjà commencé. Dans le second, il faut définir un titre en plus du message.

Quoiqu'il en soit, le visiteur souhaitant poster son message est souvent amené à vouloir mettre en forme son texte, pour le mettre en gras, par exemple. Le problème est qu'il est hors de question d'afficher un message contenant des balises html, c'est pourquoi les forums utilisent un code spécial. Dans le cas du Site du Zér0, il s'agit du zCode, dans le cas de phpbb il s'agit du bbcode, etc.

Créons notre BBcode !



La page poster.php est très spéciale et n'a rien à voir avec les autres, la raison est simple : on doit utiliser du javascript pour les balises de codes. Vous savez, les boutons sur lesquels on clique pour afficher un texte en gras, en italique, etc.
On va devoir en fabriquer nous-mêmes. :D Mais avant de faire quoi que ce soit, il faut que vous ayez lu le tuto suivant.

Apparemment le tuto en question a été retiré du SDZ, du coup c'est vrai que c'est embêtant pour comprendre le code, cela dit ce n'est pas très intéressant. Pour ceux que ça intéresse vous pouvez vous reporter aux nombreux tutos sur le JS présents sur le site. :)


On va donc afficher un code très bizarre entre les balises <head> et </head>.

Le voici :

Code : JavaScript
 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
<script>
function bbcode(bbdebut, bbfin)
{
var input = window.document.formulaire.message;
input.focus();
if(typeof document.selection != 'undefined')
{
var range = document.selection.createRange();
var insText = range.text;
range.text = bbdebut + insText + bbfin;
range = document.selection.createRange();
if (insText.length == 0)
{
range.move('character', -bbfin.length);
}
else
{
range.moveStart('character', bbdebut.length + insText.length + bbfin.length);
}
range.select();
}
else if(typeof input.selectionStart != 'undefined')
{
var start = input.selectionStart;
var end = input.selectionEnd;
var insText = input.value.substring(start, end);
input.value = input.value.substr(0, start) + bbdebut + insText + bbfin + input.value.substr(end);
var pos;
if (insText.length == 0)
{
pos = start + bbdebut.length;
}
else
{
pos = start + bbdebut.length + insText.length + bbfin.length;
}
input.selectionStart = pos;
input.selectionEnd = pos;
}
 
else
{
var pos;
var re = new RegExp('^[0-9]{0,3}$');
while(!re.test(pos))
{
pos = prompt("insertion (0.." + input.value.length + "):", "0");
}
if(pos > input.value.length)
{
pos = input.value.length;
}
var insText = prompt("Veuillez taper le texte");
input.value = input.value.substr(0, pos) + bbdebut + insText + bbfin + input.value.substr(pos);
}
}
function smilies(img)
{
window.document.formulaire.message.value += '' + img + '';
}
</script>


Si vous ne comprenez strictement rien à ce code, sachez que c'est un simple copié-collé de celui du tuto que je vous ai demandé de regarder. Il utilise des infos sur le navigateur que vous utilisez, tout simplement.


De toute façon, sa compréhension n'est pas utile pour la suite.

Attention toutefois à cette ligne :
var input = window.document.formulaire.message;
Comme expliqué dans le tuto, il faut que vous mettiez le nom du formulaire et du textarea ; donc, si vous les modifiez, pensez à changer cette partie du code.


Mais attends une seconde, la balise <head> se trouve dans la page debut.php, je fais comment, moi, pour l'inclure o_O ?


C'est juste : en fait, deux choix s'offrent à vous : la méthode bourrin et la méthode douce.
La première consiste à ne pas inclure le fichier debut.php dans cette page, et à simplement recopier son contenu, en ajoutant le code ci-dessus entre les balises <head>. Ce qui est gênant, c'est que si vous modifiez votre fichier debut.php, il faudra aussi passer ici.

La deuxième est de créer une variable $balises à true juste avant l'appel du fichier debut.php ; ensuite, dans cette dernière page, on vérifie que $balises= true, et si c'est le cas, on insère le javascript.

Faites simplement ceci :

Page : debut.php

Code : PHP
1
2
3
4
5
<?php
if($balises)
{
//Inclure le script
}


Le début de la page ressemble alors à ça :

Page : poster.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
//Cette fonction doit être appelée avant tout code html
session_start();
$balises = true;
//On donne ensuite un titre à la page, puis on appelle notre fichier debut.php
$titre = "Poster";
include("includes/debut.php");
?>
<body>
<div id="banniere"></div>
<div id="corps_forum">


Bien, on va pouvoir attaquer la suite : il va falloir lancer une connexion à la base de données pour récupérer des données.

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
<?php
//On se connecte
include("includes/identifiants.php");
mysql_connect($adresse, $nom, $motdepasse);
mysql_select_db($database);
//Qu'est ce qu'on veut faire ? poster, répondre ou éditer ?
$action = htmlspecialchars($_GET['action']);
 
//Si on veut poster un nouveau topic, la variable f se trouve dans l'url,
//On récupère certaines valeurs
if (isset($_GET['f']))
{
$forum = (int) $_GET['f'];
$requete1 = mysql_query('
SELECT forum_name, auth_view, auth_post, auth_topic, auth_annonce, auth_modo
FROM forum_forum
WHERE forum_id ="'.$forum.'"') or die(mysql_error());
$data1 = mysql_fetch_array($requete1);
?>
 
<p>
<a href ="./index.php">Index du forum</a> /
<a href="./voirforum.php?f=<?php echo ''.$forum.''; ?>"><?php echo stripslashes(htmlspecialchars($data1['forum_name'])); ?></a></p>
 
<?php
}
 
//Sinon c'est un nouveau message, on a la variable t et
//On récupère f grâce à une requête
elseif (isset($_GET['t']))
{
$topic = (int) $_GET['t'];
$requete1 = mysql_query('
SELECT topic_titre, forum_topic.forum_id,
forum_name, auth_view, auth_post, auth_topic, auth_annonce, auth_modo
FROM forum_topic
LEFT JOIN forum_forum ON forum_forum.forum_id = forum_topic.forum_id
WHERE topic_id ="'.$topic.'"')or die(mysql_error());
$data1 = mysql_fetch_array($requete1);
$forum = $data1['forum_id'];
?>
 
<p>
<a href ="./index.php">Index du forum</a> /
<a href="./voirforum.php?f=<?php echo $data1['forum_id'] ?>"><?php echo stripslashes(htmlspecialchars($data1['forum_name'])); ?></a> /
<a href="./voirtopic.php?t=<?php echo $topic ?>"><?php echo stripslashes(htmlspecialchars($data1['topic_titre'])); ?></a></p>
<?php
}
 
//Enfin sinon c'est au sujet de la modération(on verra plus tard en détail)
//On ne connait que le post, il faut chercher le reste
elseif (isset ($_GET['p']))
{
$post = (int) $_GET['p'];
$requete1 = mysql_query('
SELECT post_createur, forum_post.topic_id, topic_titre, forum_topic.forum_id,
forum_name, auth_view, auth_post, auth_topic, auth_annonce, auth_modo
FROM forum_post
LEFT JOIN forum_topic ON forum_topic.topic_id = forum_post.topic_id
LEFT JOIN forum_forum ON forum_forum.forum_id = forum_topic.forum_id
WHERE forum_post.post_id ="'.$post.'"')or die(mysql_error());
$data1 = mysql_fetch_array($requete1);
$topic = $data1['topic_id'];
$forum = $data1['forum_id'];
?>
 
<p><a href ="./index.php">Index du forum</a> /
<a href="./voirforum.php?f=<?php echo $forum ?>"><?php echo stripslashes(htmlspecialchars($data1['forum_name'])); ?></a> /
<a href="./voirtopic.php?t=<?php echo $topic ?>"><?php echo stripslashes(htmlspecialchars($data1['topic_titre'])); ?></a></p>
<?php
}
 
 
//Ici on s'intéresse au visiteur
if (isset($_SESSION['pseudo'])) // Si le membre est connecté
{
       
        //Voici les options
        echo'<p>Vous êtes connecté en tant que
        <a href="./voirprofil.php?m='.intval($_SESSION['id']).'&action=consulter">
        '.stripslashes(htmlspecialchars($_SESSION['pseudo'])).'</a><br />
        <a href="./voirprofil.php?action=modifier">Modifier mon profil</a><br />
        <a href="./messagesprives.php">Consulter mes messages privés</a><br />
        <a href ="./deconnexion.php">Se déconnecter</a><br /></p>';
 
}
 
// Sinon l'accès à cette page est interdit ! ^^
else
{
echo 'Désolé, vous devez être enregistré pour poster</div></body></html>';
exit();
}


Ce début de code joue sur la forme de l'url ; comme vous avez pu le voir sur les autres pages, il est du style :
poster.php?t=1&action=repondre
ou
poster.php?f=2&action=nouveau
ou encore
poster.php?p=3&action=edit

Dans tous les cas, on a besoin de la valeur de f : si jamais on souhaite créer un nouveau topic, elle est dans l'url, donc il n'y a pas de problème. Sinon, ce n'est pas beaucoup plus grave, il suffit de faire une requête pour la récupérer.


Le switch !



Comme pour la page de profil, notre code va s'articuler autour d'un switch de la variable $action.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?php
switch($action)
{
case "repondre": //Premier cas : on souhaite répondre
//Ici, on affiche le formulaire de réponse
break;
 
case "nouveautopic": //Deuxième cas : on souhaite créer un nouveau topic
//Ici, on affiche le formulaire de nouveau topic
break;
 
//D'autres cas viendront s'ajouter là plus tard :p
 
default; //Si jamais c'est aucun de ceux-là, c'est qu'il y a eu un problème :o
echo'<h2>Cette action est impossible</h2>';
 
} //Fin du switch
?>


Voilà le squelette du code. Si vous avez compris jusqu'ici, je n'ai même pas besoin de continuer normalement (quoi, feignasse ? :D ).

Donc, ce que l'on va mettre entre les case et les break, ce sont des zones de textes. Il en faut une pour le titre (seulement dans le cas d'un nouveau topic), et une pour le message lui-même. Seulement il faut aussi mettre les balises de texte et les smilies : c'est pourquoi le code du formulaire est un peu plus long que d'habitude. Cela dit, si vous avez lu le tuto sur le bbcode, vous n'aurez pas de problème de compréhension ^^ .

Page : poster.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
<?
switch($action)
{
case "repondre": //Premier cas on souhaite répondre
?>
<h1>Poster une réponse</h1>
 
<form method="post" action="postok.php?action=repondre&amp;t=<?php echo $topic ?>" name="formulaire">
 
<fieldset><legend>Mise en forme</legend>
<input type="button" id="gras" name="gras" value="Gras" onClick="javascript:bbcode('[g]', '[/g]');return(false)" />
<input type="button" id="italic" name="italic" value="Italic" onClick="javascript:bbcode('[i]', '[/i]');return(false)" />
<input type="button" id="souligné" name="souligné" value="Souligné" onClick="javascript:bbcode('[s]', '[/s]');return(false)" />
<input type="button" id="lien" name="lien" value="Lien" onClick="javascript:bbcode('[url]', '[/url]');return(false)" />
<br /><br />
<img src="./images/smileys/heureux.gif" title="heureux" alt="heureux" onClick="javascript:smilies(' :D ');return(false)" />
<img src="./images/smileys/lol.gif" title="lol" alt="lol" onClick="javascript:smilies(' :lol: ');return(false)" />
<img src="./images/smileys/triste.gif" title="triste" alt="triste" onClick="javascript:smilies(' :triste: ');return(false)" />
<img src="./images/smileys/cool.gif" title="cool" alt="cool" onClick="javascript:smilies(' :frime: ');return(false)" />
<img src="./images/smileys/rire.gif" title="rire" alt="rire" onClick="javascript:smilies(' XD ');return(false)" />
<img src="./images/smileys/confus.gif" title="confus" alt="confus" onClick="javascript:smilies(' :s ');return(false)" />
<img src="./images/smileys/choc.gif" title="choc" alt="choc" onClick="javascript:smilies(' :o ');return(false)" />
<img src="./images/smileys/question.gif" title="?" alt="?" onClick="javascript:smilies(' :interrogation: ');return(false)" />
<img src="./images/smileys/exclamation.gif" title="!" alt="!" onClick="javascript:smilies(' :exclamation: ');return(false)" />
</fieldset>
 
<fieldset><legend>Message</legend><textarea cols="80" rows="8" id="message" name="message"></textarea></fieldset>
 
<input type="submit" name="submit" value="Envoyer" />
<input type="reset" name = "Effacer" value = "Effacer"/>
</p></form>
<?php
break;
 
case "nouveautopic":
?>
 
<h1>Nouveau topic</h1>
<form method="post" action="postok.php?action=nouveautopic&amp;f=<?php echo $forum ?>" name="formulaire">
 
<fieldset><legend>Titre</legend>
<input type="text" size="80" id="titre" name="titre" /></fieldset>
 
<fieldset><legend>Mise en forme</legend>
<input type="button" id="gras" name="gras" value="Gras" onClick="javascript:bbcode('[g]', '[/g]');return(false)" />
<input type="button" id="italic" name="italic" value="Italic" onClick="javascript:bbcode('[i]', '[/i]');return(false)" />
<input type="button" id="souligné" name="souligné" value="Souligné" onClick="javascript:bbcode('[s]', '[/s]');return(false)" />
<input type="button" id="lien" name="lien" value="Lien" onClick="javascript:bbcode('[url]', '[/url]');return(false)" />
<br /><br />
<img src="./images/smileys/heureux.gif" title="heureux" alt="heureux" onClick="javascript:smilies(':D');return(false)" />
<img src="./images/smileys/lol.gif" title="lol" alt="lol" onClick="javascript:smilies(':lol:');return(false)" />
<img src="./images/smileys/triste.gif" title="triste" alt="triste" onClick="javascript:smilies(':triste:');return(false)" />
<img src="./images/smileys/cool.gif" title="cool" alt="cool" onClick="javascript:smilies(':frime:');return(false)" />
<img src="./images/smileys/rire.gif" title="rire" alt="rire" onClick="javascript:smilies('XD');return(false)" />
<img src="./images/smileys/confus.gif" title="confus" alt="confus" onClick="javascript:smilies(':s');return(false)" />
<img src="./images/smileys/choc.gif" title="choc" alt="choc" onClick="javascript:smilies(':O');return(false)" />
<img src="./images/smileys/question.gif" title="?" alt="?" onClick="javascript:smilies(':interrogation:');return(false)" />
<img src="./images/smileys/exclamation.gif" title="!" alt="!" onClick="javascript:smilies(':exclamation:');return(false)" /></fieldset>
 
<fieldset><legend>Message</legend>
<textarea cols="80" rows="8" id="message" name="message"></textarea>
<label><input type="radio" name="mess" value="Annonce" />Annonce</label>
<label><input type="radio" name="mess" value="Message" checked="checked" />Topic</label>
</fieldset>
<p>
<input type="submit" name="submit" value="Envoyer" />
<input type="reset" name = "Effacer" value = "Effacer" /></p>
</form>
<?php
break;
 
//D'autres cas viendront s'ajouter ici par la suite


Costaud, hein ? :p Remarquez, ça valait le coup puisqu'on a terminé notre page. Je vous l'ai dit, les autres cas, l'édition et la suppression d'un message, seront vus dans une seconde partie du tuto.

Mais revenons plutôt au code. Mises à part les zones de texte, il reste des lignes de ce genre :
Code : HTML
1
<input type="button" id="gras" name="gras" value="Gras" onClick="javascript:bbcode('[g]', '[/g]');return(false)" />

Ou de ce genre :
Code : HTML
1
<img src="./images/smileys/triste.gif" title="triste" alt="triste" onClick="javascript:smilies(':triste:');return(false)" />


C'est ici que vous allez pouvoir laisser libre cours à votre imagination la plus folle pour créer votre "bbcode" (et même changer son nom ;) ). Ce que je vous ai mis, ce sont les balises utilisées par phpbb : [g]Texte en gras[/g], [i]Texte en italique[/i], et les smilies sont également pris sur la plate-forme. Mais après, vous faites comme vous voulez ((i) et (/i) par exemple :p ), et pour cela, il suffit de modifier les lignes que je vous ai indiquées en changeant le [i] par (i), etc.

Allez, on termine !



Il ne nous reste plus qu'à fermer notre switch, nos balises html et tout le reste.

Code : PHP
1
2
3
4
5
6
7
8
9
<?php
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();
?>
</div>
</body>
</html>


C'est ici que se termine la page poster.php. Comme promis, on va passer au traitement des données : si vous avez bien lu le code, vous avez vu que la page en question a pour petit nom postok.php (oui, je sais, j'ai un goût pourri pour trouver les noms de pages :-° ).

Mais avant de repartir au combat, on va faire une petite pause pour compléter la création de notre bbcode... :)

Le bbcode

Comme je vous l'avez promis au début, dans l'introduction de ce tuto, la création d'un forum touche vraiment à tous les points du php, étudiés dans les cours officiels du Site du Zér0.
Et comme je tiens mes promesses :) , on va utiliser ici la création de fonctions, choses qu'on n'avait pas encore touché. Plus précisément, on va créer la fonction qui permettra de traduire le texte écrit en bbcode (ou en zcode, ou en ce que vous voulez), de façon à obtenir le rendu que l'on souhaite sur le forum. Et comme une bonne nouvelle n'arrive jamais seule, on va aussi devoir utiliser les regex :p .

Avant toute chose, on trouve un nom à cette fonction : personnellement je l'ai appelé code : il faut aussi lui donner un paramètre, le texte à transformer. On a donc ceci :

Code : PHP
1
2
3
<?php
function code($texte)
{


Ensuite, on fait passer notre variable $texte dans une série de preg_replace, avant de la retourner transformée.

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
function code($texte)
{
//Smileys
$texte = str_replace(':D ', '<img src="/images/smileys/heureux.gif" title="heureux" alt="heureux" />', $texte);
$texte = str_replace(':lol: ', '<img src="/images/smileys/lol.gif" title="lol" alt="lol" />', $texte);
$texte = str_replace(':triste:', '<img src="/images/smileys/triste.gif" title="triste" alt="triste" />', $texte);
$texte = str_replace(':frime:', '<img src="/images/smileys/cool.gif" title="cool" alt="cool" />', $texte);
$texte = str_replace(':rire:', '<img src="/images/smileys/rire.gif" title="rire" alt="rire" />', $texte);
$texte = str_replace(':s', '<img src="/images/smileys/confus.gif" title="confus" alt="confus" />', $texte);
$texte = str_replace(':O', '<img src="/images/smileys/choc.gif" title="choc" alt="choc" />', $texte);
$texte = str_replace(':question:', '<img src="/images/smileys/question.gif" title="?" alt="?" />', $texte);
$texte = str_replace(':exclamation:', '<img src="/images/smileys/exclamation.gif" title="!" alt="!" />', $texte);

//Mise en forme du texte
//gras
$texte = preg_replace('`\[g\](.+)\[/g\]`isU', '<strong>$1</strong>', $texte); 
//italique
$texte = preg_replace('`\[i\](.+)\[/i\]`isU', '<em>$1</em>', $texte);
//souligné
$texte = preg_replace('`\[s\](.+)\[/s\]`isU', '<u>$1</u>', $texte);
//lien
$texte = preg_replace('#http://[a-z0-9._/-]+#i', '<a href="$0">$0</a>', $texte);
//etc., etc.

//On retourne la variable texte
return $texte;
}
?>


Ce que je vous ai donné ici n'est qu'un échantillon, libre à vous de rajouter des balises de mises en forme (barré, citation...).


Pour mieux comprendre ce code, il faut reprendre les lignes de code bizarroïdes de la page poster.php. Vous vous souvenez ? Ce type de balises :

Code : HTML
1
<input type="button" id="gras" name="gras" value="Gras" onClick="javascript:bbcode('[g]', '[/g]');return(false)" />


Ce sont [g] et [/g] qui délimitent le texte à mettre en gras ; grâce à notre fonction, on remplace [g] et [/g], qui est du simple texte pour l'ordinateur, par <strong> et </strong>.

Un mot sur le quote



Un grand absent de cette fonction est la balise [quote]. Présente sur quasiment tous les forum, elle permet de faire référence au message de quelqu'un d'autre.

Citation : General Vans
Ceci est un quote !


La raison de son absence est qu'elle diffère légèrement des autres, et j'ai donc souhaité la traiter à part.
Pour réaliser cette balise, il vous faut ouvrir le fichier css du forum, et ajouter le code suivant :

Code : CSS
1
2
3
4
5
6
7
8
#quote
{
width: 100%;
background-color : rgb(220,220,220);
margin-top: 2px;
margin-bottom: 2px;
font-family: "Comic sans MS", Arial, Verdana, serif;
}


Encore une fois, ceci n'est qu'indicatif, vous pouvez modifier n'importe laquelle de ces lignes selon ce que vous voulez faire.
Une fois enregistré, rajouter cette ligne dans la fonction :

Code : PHP
1
$texte = preg_replace('`\[quote\](.+)\[/quote\]`isU', '<div id="quote">$1</div>', $texte);


Si vous voulez un bon entraînement, vous pouvez faire en sorte de rajouter le nom de l'auteur dans la citation.

Secret (cliquez pour afficher)
'`\[quote auteur=([a-z0-9A-Z._-]+) \](.+)\[/quote\]`isU', '<div id="quote">Auteur : $1 </ br> $2 </div>


Et le tour est joué :D .

Euh... je la mets où, cette fonction ?


C'est encore une fois à vous de voir : personnellement, je vous conseille de créer un fichier fonction.php que vous placerez dans le dossier includes. L'avantage, c'est que vous pourrez plus facilement réutiliser cette fonction sur plusieurs pages (script de news pour votre site, livre d'or, etc.).
Mais vous pouvez aussi le recopier en haut de chaque page... cela dit, ce n'est pas une bonne idée si un jour vous êtes amenés à le modifier.

Vous avez pu voir dans la page précédente que je l'ai mise dans un fichier appelé bbcode.php.


On en a fini avec notre bbcode, et la fin approche ;) , on va maintenant parler de la page de traitement du message.

Traiter le message

Le code de cette page, que j'ai appelée postok.php, s'articule autour d'un switch sur la valeur de la variable $action (exactement comme la page poster.php, en fait).
Si on souhaite créer un nouveau topic, il faudra remplir les champs de la table forum_topic en plus de ceux de forum_post, puis mettre à jour les champs membre_post, forum_post et forum_topic. En effet, on a besoin d'entrer des infos à la fois sur le sujet en général mais également sur le message qui va être posté, et qui va constituer le premier du topic.
Si par contre on souhaite simplement répondre, on n'a pas ce problème puisqu'il s'agira simplement d'entrer les données dans la table forum_post, et de mettre à jour les 2 autres.

Le début



Le code du début est identique aux autres, encore une fois :

Page : postok.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
<?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 = "Poster";
include("includes/debut.php");
?>
<body>
<div id="banniere"></div>
<div id="corps_forum">

<?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 la variable action
$action = htmlspecialchars($_GET['action']);

// Si le membre n'est pas connecté, il est arivé ici par erreur
if (!isset($_SESSION['pseudo']))
{
echo'<p>Erreur : Vous n êtes plus connecté</p>';
}
else //Sinon on lance la suite
{


Vous pouvez remarquer qu'ici, contrairement à la page poster.php, on ne cherche pas à récupérer tout de suite la valeur de $forum ou de $topic. La raison est qu'on ne sait toujours pas si on veut créer un nouveau sujet ou répondre ; on prendra donc la valeur de ces variables dans le switch.

Le switch !



Le switch est le même que celui de la page poster.php, et il ne sera donc pas terminé. Logique, puisqu'il faut aussi tester les valeurs de $action pour éditer ou supprimer.

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
switch($action)
{
//Premier cas : nouveau topic
case "nouveautopic":
//On passe le message dans une série de fonction
$message = mysql_real_escape_string($_POST['message']);
$mess = mysql_real_escape_string($_POST['mess']);

//Pareil pour le titre
$titre = mysql_real_escape_string($_POST['titre']);

//ici seulement, maintenant qu'on est sur qu'elle existe, on récupère la valeur de la variable f
$forum = (int) $_GET['f'];
$temps = time();

if (empty($message) || empty($titre))
{
echo'<p>Votre message ou votre titre est vide, cliquez <a href="./poster.php?action=nouveautopic&amp;f='.$forum.'">ici</a> pour recommencer</p>';
}
else //Si jamais le message n'est pas vide
{


Le cas du nouveau topic ne s'arrête pas ici, mais je fais une pause pour éclaircir ce bout de code. Le formulaire de la page précédente a envoyé une variable qui contient le message : comme d'habitude, on vérifie qu'il n'y a pas de html dedans, puis on l'enregistre.

Pourquoi on n'utilise pas la fonction code sur cette page ?


Parce que sinon, au moment de l'édition, il sera impossible de récupérer le message avec les balises bbcode. Et du coup, ça sera quasiment impossible de le modifier, sauf si vous créez une fonction inverse qui remplacerait le html par du bbcode, mais là, ça tient du masochisme ^^ .

Pour la suite du code, je dois vous présenter une fonction de php mysql_insert_id.
Elle permet de récupérer l'id de la dernière requête. Je m'explique : en même temps qu'on envoie à la base de données des infos sur le nouveau topic créé, on en envoie aussi sur le premier message de ce topic.
Jusqu'ici tout va bien, sauf que si vous regardez en détail les champs de ces deux tables, vous voyez qu'on a topic_last_post et post_topic.

Mais alors, comment connaitre les valeurs à entrer dans ces deux champs, puisque les id sont en auto-increment ?


Bah, la fonction permet de retourner ces id ; donc, ce qu'on va faire, c'est qu'on va d'abord faire la requête avec le topic, et on laissera les champs topic_last_post et topic_first_post à 0. Ensuite, on va envoyer le post dont on connaîtra la valeur de post_topic grâce à la fonction. Et enfin, on update le topic.

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
<?php
//On entre le topic dans la base de donnée en laissant
//le champ topic_last_post à 0
mysql_query("INSERT INTO forum_topic
(forum_id, topic_titre, topic_createur, topic_vu, topic_time, topic_genre, topic_last_post, topic_post)
VALUES('".$forum."', '".$titre."', '".intval($_SESSION['id'])."', '1', '".$temps."','".$mess."', '0', '0'  )")
or die ("Un problème est survenu lors de l'envoi du message");

$nouveautopic = mysql_insert_id();

//Puis on entre le message
mysql_query("INSERT INTO forum_post
(post_id, post_createur, post_texte, post_time, topic_id, post_forum_id)
VALUES(',' ,'".intval($_SESSION['id'])."', '".$message."', '".$temps."', '".$nouveautopic."', '".$forum."')")
or die ("Un problème est survenu lors de l'envoi du message");

$nouveaupost = mysql_insert_id();

//Ici on update comme prévu la valeur de topic_last_post et de topic_first_post
mysql_query("UPDATE forum_topic
SET topic_last_post = '".$nouveaupost."',
topic_first_post = '".$nouveaupost."'
WHERE topic_id = '".$nouveautopic."'")
or die ("Un problème est survenu lors de l'envoi du message");


//Enfin on met à jour les tables forum_forum et forum_membres
mysql_query("UPDATE forum_forum
SET forum_post = forum_post + 1 ,
forum_topic = forum_topic + 1,
forum_last_post_id = '".$nouveaupost."'
WHERE forum_id = '".$forum."'")
or die ("Un problème est survenu lors de l'envoi du message");

mysql_query("UPDATE forum_membres
SET membre_post = membre_post + 1
WHERE membre_id = '".intval($_SESSION['id'])."'")
or die ("Un problème est survenu lors de l'envoi du message");

//Et un petit message
echo'<p>Votre message a bien été ajouté!<br /><br />Cliquez <a href="./index.php">ici</a> pour revenir à l index du forum<br />Cliquez <a href="./voirtopic.php?t='.$nouveautopic.'">ici</a> pour le voir</p>';
}
break; //Houra !
?>


Vous remarquez que la fonction mysql_insert_id ne prend aucun paramètre : il suffit juste de la placer en dessous de la requête qu'on veut étudier.

Une autre méthode consisterait à enlever les auto-increment de vos tables, et à tout gérer vous-mêmes ; à ce moment-là, plus besoin de la fonction mysql_insert_id. :)


Suite du switch



La seconde partie du switch va être beaucoup plus simple, puisque c'est la même que celle que l'on vient de réaliser, mais en plus simple, car on n'aura pas à remplir les champs de la table forum_topic.

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
<?
//Deuxième cas : répondre
case "repondre":
//On passe le message dans une série de fonction
$message = mysql_real_escape_string($_POST['message']);


//ici seulement, maintenant qu'on est sur qu'elle existe, on récupère la valeur de la variable t
$topic = (int) $_GET['t'];
$temps = time();

if (empty($message))
{
echo'<p>Votre message est vide, cliquez <a href="./poster.php?action=repondre&amp;t='.$topic.'">ici</a> pour recommencer</p>';
}
else //Sinon, si le message n'est pas vide
{

//On récupère l'id du forum
$requete2 = mysql_query('SELECT forum_id, topic_post
FROM forum_topic
WHERE topic_id = "'.$topic.'"');

$data2= mysql_fetch_assoc($requete2) or die ("Une erreur semble être survenue lors de l'envoi du message");
$forum = $data2['forum_id'];

//Puis on entre le message
mysql_query("INSERT INTO forum_post
(post_id, post_createur, post_texte, post_time, topic_id, post_forum_id)
VALUES(',' ,'".intval($_SESSION['id'])."', '".$message."', '".$temps."', '".$topic."', '".$forum."')")
or die ("Une erreur semble avoir survenu lors de l'envoi du message");

$nouveaupost = mysql_insert_id();

//On change un peu la table forum_topic
mysql_query("UPDATE forum_topic
SET topic_post = topic_post + 1,
topic_last_post = '".$nouveaupost."'
WHERE topic_id ='".$topic."'")
or die ("Une erreur semble avoir survenu lors de l'envoi du message");

//Puis même combat sur les 2 autres tables
mysql_query("UPDATE forum_forum
SET forum_post = forum_post + 1 ,
forum_last_post_id = '".$nouveaupost."'
WHERE forum_id = '".$forum."'")
or die ("Une erreur semble avoir survenu lors de l'envoi du message");

mysql_query("UPDATE forum_membres
SET membre_post = membre_post + 1
WHERE membre_id = '".intval($_SESSION['id'])."'")
or die ("Une erreur semble avoir survenu lors de l'envoi du message");

//Et un petit message
$nombreDeMessagesParPage = 15;
$nbr_post = $data2['topic_post']+1;
$page = ceil($nbr_post / $nombreDeMessagesParPage);
echo'<p>Votre message a bien été ajouté!<br /><br />
Cliquez <a href="./index.php">ici</a> pour revenir à l index du forum<br />
Cliquez <a href="./voirtopic.php?t='.$topic.'&amp;page='.$page.'#p_'.$nouveaupost.'">ici</a> pour le voir</p>';
}
break;
?>


Ce code est, à quelques détails près, le même que celui de la première partie du switch. La seule différence notable est qu'on doit lancer une requête pour récupérer l'id du forum, celui dans lequel se trouve le topic sur lequel on veut ajouter une réponse.

La fin du code



Je le rappelle une fois de plus, le code n'est pas terminé puisqu'on y reviendra au moment de créer les pages d'administration.
En attendant, je laisse un blanc, et on achève le script en fermant le switch, puis les balises.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?
default;
echo'<p>Cette action est impossible</p>';
} //Fin du Switch
} //Fin du else, le membre est connecté
mysql_close();
?>
</div>
</body>
</html>


Bon, bah que dire ? Vous avez terminé la page :D . Vous pouvez déjà tester en postant des messages : normalement ça se passera bien. :-°

Nous y voilà, la partie basique de votre forum est terminée. Vous pouvez presque le lancer dès maintenant puisque l'on peut s'y inscrire, poster, répondre, lire...
Dans la suite du tutoriel, on va s'occuper d'ajouter des systèmes pour améliorer un peu tout ça.
Et pour commencer, on va s'attaquer aux messages privés ! :pirate:
Chapitre précédent Sommaire Chapitre suivant
Retour en haut Retour en haut


Créé : le 13/09/2006 à 19:48:41
Modifié : le 01/09/2008 à 23:08:45
Avancement : 100%

59 commentaires

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 218 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0937s (0.0804s)