Aller au menu - Aller au contenu

Icône Poster

Avatar
Mise à jour : 30/11/2010
Difficulté : Facile Facile Creative Commons BY
4 418 visites depuis 7 jours , dont 252 sur ce chapitre , classé 40/777
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 un script en 2 parties : une proposant de poster un message, et une autre pour le traiter, et afficher un message d'erreur. Ici exceptionnellement nous allons séparer les deux parties sur deux pages différentes. La raison est que les codes sont assez lourds et que c'est beaucoup plus clair comme ça.

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

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.

Quoi qu'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 Pour cela, j'ai recopié un code qui provient d'un ancien tuto, maintenant disparu du SDZ, pour ceux que ça intéresse, je vous envoie vers le tuto suivant : Insertion de balises dans une zone texte, qui est différent mais qui propose le même résultat.

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 à ces lignes :
var input = window.document.formulaire.message;
window.document.formulaire.message.value += '' + img + '';
Comme expliqué dans le tuto, il faut que vous mettiez le nom du formulaire et du textarea ; donc, si vous les modifiez, pensez à changer ces parties 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
6
<?php
$balises=(isset($balises))?$balises:0;
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
<?php
session_start();
$titre="Poster";
$balises = true;
include("includes/identifiants.php");
include("includes/debut.php");
include("includes/menu.php");
?>


Bien, on va pouvoir attaquer la suite : il va falloir récupérer quelques 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
<?php
//Qu'est ce qu'on veut faire ? poster, répondre ou éditer ?
$action = (isset($_GET['action']))?htmlspecialchars($_GET['action']):'';

//Il faut être connecté pour poster !
if ($id==0) erreur(ERR_IS_CO);

//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'];
    $query= $db->prepare('SELECT forum_name, auth_view, auth_post, auth_topic, auth_annonce, auth_modo
    FROM forum_forum WHERE forum_id =:forum');
    $query->bindValue(':forum',$forum,PDO::PARAM_INT);
    $query->execute();
    $data=$query->fetch();
    echo '<p><i>Vous êtes ici</i> : <a href="./index.php">Index du forum</a> --> 
    <a href="./voirforum.php?f='.$data['forum_id'].'">'.stripslashes(htmlspecialchars($data['forum_name'])).'</a>
    --> Nouveau topic</p>';

 
}
 
//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'];
    $query=$db->prepare('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');
    $query->bindValue(':topic',$topic,PDO::PARAM_INT);
    $query->execute();
    $data=$query->fetch();
    $forum = $data['forum_id'];  

    echo '<p><i>Vous êtes ici</i> : <a href="./index.php">Index du forum</a> --> 
    <a href="./voirforum.php?f='.$data['forum_id'].'">'.stripslashes(htmlspecialchars($data['forum_name'])).'</a>
    --> <a href="./voirtopic.php?t='.$topic.'">'.stripslashes(htmlspecialchars($data['topic_titre'])).'</a>
    --> Répondre</p>';
}
 
//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'];
    $query=$db->prepare('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');
    $query->bindValue(':post',$post,PDO::PARAM_INT);
    $query->execute();
    $data=$query->fetch();

    $topic = $data['topic_id'];
    $forum = $data['forum_id'];
 
    echo '<p><i>Vous êtes ici</i> : <a href="./index.php">Index du forum</a> --> 
    <a href="./voirforum.php?f='.$data['forum_id'].'">'.stripslashes(htmlspecialchars($data['forum_name'])).'</a>
    --> <a href="./voirtopic.php?t='.$topic.'">'.stripslashes(htmlspecialchars($data['topic_titre'])).'</a>
    --> Modérer un message</p>';
}
$query->CloseCursor();  
?>


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
73
<?php
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
<?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
?>
</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'avais 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 de modification d'un texte, choses qu'on n'avait pas encore touchées. 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 d'ailleurs :p ), de façon à obtenir le rendu que l'on souhaite sur le forum. Et comme une bonne nouvelle n'arrive jamais seule, on va du coup devoir utiliser les regex (youpi !) :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 : Tadzoa
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 functions_txt.php que vous placerez dans le dossier includes. L'avantage, c'est que vous pourrez plus facilement réutiliser cette fonction sur plusieurs pages de votre site (script de news pour votre site, livre d'or, etc.).
Je préfère séparer les fonctions textes des autres parce qu'elles sont un peu particulières, cela dit vous faites ce que vous voulez.

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
<?php
session_start();
$titre="Poster";
include("includes/identifiants.php");
include("includes/debut.php");
include("includes/menu.php");
//On récupère la valeur de la variable action
$action = (isset($_GET['action']))?htmlspecialchars($_GET['action']):'';

// Si le membre n'est pas connecté, il est arrivé ici par erreur
if ($id==0) erreur(ERR_IS_CO);
?>


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

    //Pareil pour le titre
    $titre = $_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.

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 méthode de PDO lastInsertId (d'ailleurs on l'avait déjà utilisé discrètement dans la page register.php).
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
        //On entre le topic dans la base de donnée en laissant
        //le champ topic_last_post à 0
        $query=$db->prepare('INSERT INTO forum_topic
        (forum_id, topic_titre, topic_createur, topic_vu, topic_time, topic_genre)
        VALUES(:forum, :titre, :id, 1, :temps, :mess)');
        $query->bindValue(':forum', $forum, PDO::PARAM_INT);
        $query->bindValue(':titre', $titre, PDO::PARAM_STR);
        $query->bindValue(':id', $id, PDO::PARAM_INT);
        $query->bindValue(':temps', $temps, PDO::PARAM_INT);
        $query->bindValue(':mess', $mess, PDO::PARAM_STR);
        $query->execute();


        $nouveautopic = $db->lastInsertId(); //Notre fameuse fonction !
        $query->CloseCursor(); 

        //Puis on entre le message
        $query=$db->prepare('INSERT INTO forum_post
        (post_createur, post_texte, post_time, topic_id, post_forum_id)
        VALUES (:id, :mess, :temps, :nouveautopic, :forum)');
        $query->bindValue(':id', $id, PDO::PARAM_INT);
        $query->bindValue(':mess', $message, PDO::PARAM_STR);
        $query->bindValue(':temps', $temps,PDO::PARAM_INT);
        $query->bindValue(':nouveautopic', (int) $nouveautopic, PDO::PARAM_INT);
        $query->bindValue(':forum', $forum, PDO::PARAM_INT);
        $query->execute();


        $nouveaupost = $db->lastInsertId(); //Encore notre fameuse fonction !
        $query->CloseCursor(); 


        //Ici on update comme prévu la valeur de topic_last_post et de topic_first_post
        $query=$db->prepare('UPDATE forum_topic
        SET topic_last_post = :nouveaupost,
        topic_first_post = :nouveaupost
        WHERE topic_id = :nouveautopic');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO::PARAM_INT);    
        $query->bindValue(':nouveautopic', (int) $nouveautopic, PDO::PARAM_INT);
        $query->execute();
        $query->CloseCursor();

        //Enfin on met à jour les tables forum_forum et forum_membres
        $query=$db->prepare('UPDATE forum_forum SET forum_post = forum_post + 1 ,forum_topic = forum_topic + 1, 
        forum_last_post_id = :nouveaupost
        WHERE forum_id = :forum');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO::PARAM_INT);    
        $query->bindValue(':forum', (int) $forum, PDO::PARAM_INT);
        $query->execute();
        $query->CloseCursor();
    
        $query=$db->prepare('UPDATE forum_membres SET membre_post = membre_post + 1 WHERE membre_id = :id');
        $query->bindValue(':id', $id, PDO::PARAM_INT);    
        $query->execute();
        $query->CloseCursor();

        //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 méthodelastInsertId 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 facile, 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
64
65
66
<?php
    //Deuxième cas : répondre
    case "repondre":
    $message = $_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
        $query=$db->prepare('SELECT forum_id, topic_post FROM forum_topic WHERE topic_id = :topic');
        $query->bindValue(':topic', $topic, PDO::PARAM_INT);    
        $query->execute();
        $data=$query->fetch();
        $forum = $data['forum_id'];

        //Puis on entre le message
        $query=$db->prepare('INSERT INTO forum_post
        (post_createur, post_texte, post_time, topic_id, post_forum_id)
        VALUES(:id,:mess,:temps,:topic,:forum)');
        $query->bindValue(':id', $id, PDO::PARAM_INT);   
        $query->bindValue(':mess', $message, PDO::PARAM_STR);  
        $query->bindValue(':temps', $temps, PDO::PARAM_INT);  
        $query->bindValue(':topic', $topic, PDO::PARAM_INT);   
        $query->bindValue(':forum', $forum, PDO::PARAM_INT); 
        $query->execute();

        $nouveaupost = $db->lastInsertId();
        $query->CloseCursor(); 

        //On change un peu la table forum_topic
        $query=$db->prepare('UPDATE forum_topic SET topic_post = topic_post + 1, topic_last_post = :nouveaupost WHERE topic_id =:topic');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO::PARAM_INT);   
        $query->bindValue(':topic', (int) $topic, PDO::PARAM_INT); 
        $query->execute();
        $query->CloseCursor(); 

        //Puis même combat sur les 2 autres tables
        $query=$db->prepare('UPDATE forum_forum SET forum_post = forum_post + 1 , forum_last_post_id = :nouveaupost WHERE forum_id = :forum');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO::PARAM_INT);   
        $query->bindValue(':forum', (int) $forum, PDO::PARAM_INT); 
        $query->execute();
        $query->CloseCursor(); 

        $query=$db->prepare('UPDATE forum_membres SET membre_post = membre_post + 1 WHERE membre_id = :id');
        $query->bindValue(':id', $id, PDO::PARAM_INT); 
        $query->execute();
        $query->CloseCursor(); 

        //Et un petit message
        $nombreDeMessagesParPage = 15;
        $nbr_post = $data['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>';
    }//Fin du else
    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
<?php
    default;
    echo'<p>Cette action est impossible</p>';
} //Fin du Switch
?>
</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

Partager

131 commentaires pour "Poster"
Note moyenne : 3.66 / 4 (334 votes)
Pseudo Commentaire
Hors ligne minijackson # Posté le 06/12/2011 à 21:02:36
Programmeur de vos rêves
Avatar

Je poste ici dans l'intention de donner mon propre fichier de conversion bbcode => html (qui je pense est plutôt avancé). Voici un exemplaire exhaustif de toutes les balises prises en charges :
Secret (cliquez pour afficher)
<p>Test de l'injection HTML</p>
[u]je suis souligné,[/u]
[color=red]je suis en rouge,[/color]
[b]je suis en gras,[/b]
[i]je suis en italique,[/i]
[s]je suis barré[/s]
[strike]et encore barré,[/strike]
[color=aqua]moi en aqua,[/color]
[color=#FF8844]moi en #FF8844,[/color]
[color=rgb(100,20,30)]moi en rgb,[/color]
[color=rgba(10,20,30,0.4)]moi en rgba,[/color]
[color=hsl(40,30%,20%)]moi en hsl,[/color]
[color=hsla(40,30%,20%,0.1)]moi en hsla[/color]
[url=http://www.siteduzero.com]url V.1[/url]
url V.2 :[url]http://www.siteduzero.com/[/url]
img V.1[img]http://www.gif-image.com/M/maggie-simpson/gif-image-maggie-simpson-1.gif[/img]
img+lien[url=http://www.siteduzero.com/][img]http://www.gif-image.com/M/maggie-simpson/gif-image-maggie-simpson-1.gif[/img][/url]
[hr]
[quote]Texte cité 1[/quote]
[quote=minijackson]Texte cité 2[/quote]
[hr]
[size=5px]écrit petit[/size]
[size=5em]écrit gros ![/size]
[left]à gauche[/left]
[right]à droite[/right]
[center]au centre[/center]
[justify]justifié[/justify]
[scroll]texte défilant[/scroll]
[updown]text défilant 2 ![/updown]
[blur]dirty Diana[/blur]
[spoiler]Coucou ![/spoiler]
[hide=cherchez-moi !]Zut, vous m'avez trouvé :'-([/hide]
x[sub]2[/sub] = 3x[sup]3[/sup]


Et voici l'ensemble des RegEx en php (remarquez la longueur de la RegEx des couleurs ;) ) :

Secret (cliquez pour afficher)
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
<?php
if(isset($_POST['Submit']) && isset($_POST['bbcode']))
{
	$bbcode = htmlspecialchars($_POST['bbcode']);
	$bbcode = preg_replace('#\n#isU', '<br />', $bbcode);							//Entrées
	$bbcode = preg_replace('#\[hr\]#isU', '<hr />', $bbcode);						//Lignes de sépraration
	$bbcode = preg_replace('#\[b\](.+)\[/b\]#isU', '<strong>$1</strong>', $bbcode);				//Gras
	$bbcode = preg_replace('#\[i\](.+)\[/i\]#isU', '<em>$1</em>', $bbcode);					//Italique
		//Coloré
	$bbcode = preg_replace('#\[color=(aqua|black|blue|fuchsia|grey|green|lime|maroon|navy|olive|purple|red|silver|teal|white|yellow|\#[0-9a-f]{3}|\#[0-9a-f]{6}|rgb\((?:[01]?\d{1,2}|2[0-5]{2}),(?:[01]?\d{1,2}|2[0-5]{2}),(?:[01]?\d{1,2}|2[0-5]{2})\)|rgba\((?:[01]?\d{1,2}|2[0-5]{2}),(?:[01]?\d{1,2}|2[0-5]{2}),(?:[01]?\d{1,2}|2[0-5]{2}),(?:0\.\d+|1)\)|hsl\((?:[01]?\d{1,2}|2[0-5]{2}),(?:100|0{0,}\d{1,2})%,(?:100|0{0,}\d{1,2})%\)|hsla\((?:[01]?\d{1,2}|2[0-5]{2}),(?:100|0{0,}\d{1,2})%,(?:100|0{0,}\d{1,2})%,(?:0\.\d+|1)\))\](.+)\[/color\]#isU', '<span style="color:$1;">$2</span>', $bbcode);
	$bbcode = preg_replace('#\[u\](.+)\[/u\]#isU', '<ins>$1</ins>', $bbcode);				//Souligné
	$bbcode = preg_replace('#\[s\](.+)\[/s\]#isU', '<del>$1</del>', $bbcode);				//Barré V.1
	$bbcode = preg_replace('#\[strike\](.+)\[/strike\]#isU', '<del>$1</del>', $bbcode);			//Barré V.2
	$bbcode = preg_replace('#\[img\](.+)\[/img\]#isU', '<img src="$1" />', $bbcode);			//Image
	$bbcode = preg_replace('#\[url=(.+)\](.+)\[/url\]#isU', '<a href="$1">$2</a>', $bbcode);		//Url V.1
	$bbcode = preg_replace('#\[url\](.+)\[/url\]#isU', '<a href="$1">$1</a>', $bbcode);			//Url V.2
	$bbcode = preg_replace('#\[quote\](.+)\[/quote\]#isU', '<span class="c">Citation</span><cite>$1</cite>', $bbcode);//Citation V.1
	$bbcode = preg_replace('#\[quote=(.+)\](.+)\[/quote\]#isU', '<span class="c">Citation de : <strong>$1</strong></span><cite>$2</cite>', $bbcode);//Citation V.2
	$bbcode = preg_replace('#\[size=(\d+(?:px|em|%))\](.+)\[/size\]#isU', '<span style="font-size:$1;">$2</span>', $bbcode);//Taille texte
	$bbcode = preg_replace('#\[right\](.+)\[/right\]#isU', '<span class="right">$1</span>', $bbcode);	//À droite
	$bbcode = preg_replace('#\[left\](.+)\[/left\]#isU', '<span class="left">$1</span>', $bbcode);		//À gauche
	$bbcode = preg_replace('#\[center\](.+)\[/center\]#isU', '<span class="center">$1</span>', $bbcode);	//Au centre
	$bbcode = preg_replace('#\[justify\](.+)\[/justify\]#isU', '<span class="justify">$1</span>', $bbcode);	//Justifié
	$bbcode = preg_replace('#\[scroll\](.+)\[/scroll\]#isU', '<marquee>$1</marquee>', $bbcode);		//Texte défilant horizontal
	$bbcode = preg_replace('#\[updown\](.+)\[/updown\]#isU', '<marquee direction="up" style="height:75px;">$1</marquee>', $bbcode);//Text défilant horizontal
	$bbcode = preg_replace('#\[blur\](.+)\[/blur\]#isU', '<span class="blur">$1</span>', $bbcode);		//Sale
		//Spoiler
	$bbcode = preg_replace('#\[spoiler\](.+)\[/spoiler\]#isU', '<span><span onclick="spoiler(this);" class="spoiler">Spoiler :</span><span class="hidden" style="display:none;">$1</span></span>', $bbcode);
		//"Hidder"
	$bbcode = preg_replace('#\[hide=(.+)\](.+)\[/hide\]#isU', '<span><span onclick="spoiler(this);" class="spoiler">$1</span><span class="hidden" style="display:none;">$2</span></span>', $bbcode);
	$bbcode = preg_replace('#\[sub\](.+)\[/sub\]#isU', '<sub>$1</sub>', $bbcode);				//Indice
	$bbcode = preg_replace('#\[sup\](.+)\[/sup\]#isU', '<sup>$1</sup>', $bbcode);				//Exposant
		
	echo $bbcode;
	}
?>



et pour le css du bbcode (pas terrible mais je poste quand même) :

Secret (cliquez pour afficher)
Code : CSS
 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
/*
bbCode Stylesheet
by minijackson
*/


cite, span.hidden{
	text-indent:20px;	/*Alinéa*/
	
	border-radius:0px 0px 10px 10px;
	-moz-border-radius:0px 0px 10px 10px;
	
	padding:7px;
	
	min-height:50px;
	background-color:#DDD;
	display:block;
}
span.c, span.spoiler{
	padding:2px;

	text-indent:7px;

	border-radius:15px 15px 0px 0px / 20px 20px 0px 0px;
	-moz-border-radius:15px 15px 0px 0px / 20px 20px 0px 0px;
	
	background-color:#AAA;
	display:block;
}
span.c:hover, span.spoiler:hover{
	background-color:#CCC;
}
span.center{
	display:block;
	text-align:center;
}
span.left{
	display:block;
	text-align:left;
}
span.right{
	display:block;
	text-align:right;
}
span.justify{
	display:block;
	text-align:justify;
}
span.blur{
	text-shadow: 1px -2px 1px #88421D;
}


Ah bon ?
 
Hors ligne kolia60 # Posté le 28/12/2011 à 22:27:05

Bonsoir à tous,

J'ai suivi le super tuto de Tadzoa du début à la fin et le forum fonctionne parfaitement... enfin presque.

Sans que je ne l'explique, de temps en temps (trop souvent à mon goût), certains post sont affublés d'un "post_createur" inexistant.

Pour rappel, ce champ "post_createur" dans la table "forum_post" correpond à l'id du membre ayant posté.

Or, avec moins de 50 membres, certains post sont affublés d'un "post_createur" supérieur à 1000 !!!

Du coup, on ne sait pas qui poste...

Sans rentrer dans les méandres des pages du tuto, je souhaitais savoir si vous avez déjà rencontré ce genre de pb ou si vous avez une piste pouvant m'aider.
Hors ligne thebbo # Posté le 13/01/2012 à 23:38:24

Bonjour,
voila quand je poste une réponsee rien ne s' affiche pourtan il dise vous avez bien poster une reponse

voila le code qui beug je pense

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
<?php case "repondre":
    $message = $_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();
	$query=$db->prepare('SELECT topic_locked FROM forum_topic WHERE topic_id = :topic');
    $query->bindValue(':topic',$topic,PDO::PARAM_INT);
    $query->execute(); 
    $data=$query->fetch();
    if ($data['topic_locked'] != 0)
    {
        erreur(ERR_TOPIC_VERR); //A vous d'afficher un message du genre : le topic est verrouillé qu'est ce que tu fous là !?
    }
    $query->CloseCursor();

    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
        $query=$db->prepare('SELECT forum_id, topic_post FROM forum_topic WHERE topic_id = :topic');
        $query->bindValue(':topic', $topic, PDO::PARAM_INT);    
        $query->execute();
        $data=$query->fetch();
        $forum = $data['forum_id'];

        //Puis on entre le message
        $query=$db->prepare('INSERT INTO forum_post
        (post_createur, post_texte, post_time, topic_id, post_forum_id)
        VALUES(:id,:mess,:temps,:topic,:forum)');
        $query->bindValue(':id', $id, PDO::PARAM_INT);   
        $query->bindValue(':mess', $message, PDO::PARAM_STR);  
        $query->bindValue(':temps', $temps, PDO::PARAM_INT);  
        $query->bindValue(':topic', $topic, PDO::PARAM_INT);   
        $query->bindValue(':forum', $forum, PDO::PARAM_INT); 
        $query->execute();

        $nouveaupost = $db->lastInsertId();
        $query->CloseCursor(); 

        //On change un peu la table forum_topic
        $query=$db->prepare('UPDATE forum_topic SET topic_post = topic_post + 1, topic_last_post = :nouveaupost WHERE topic_id =:topic');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO::PARAM_INT);   
        $query->bindValue(':topic', (int) $topic, PDO::PARAM_INT); 
        $query->execute();
        $query->CloseCursor(); 

        //Puis même combat sur les 2 autres tables
        $query=$db->prepare('UPDATE forum_forum SET forum_post = forum_post + 1 , forum_last_post_id = :nouveaupost WHERE forum_id = :forum');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO::PARAM_INT);   
        $query->bindValue(':forum', (int) $forum, PDO::PARAM_INT); 
        $query->execute();
        $query->CloseCursor(); 

        $query=$db->prepare('UPDATE forum_membres SET membre_post = membre_post + 1 WHERE membre_id = :id');
        $query->bindValue(':id', $id, PDO::PARAM_INT); 
        $query->execute();
        $query->CloseCursor(); 

        //Et un petit message
        $nombreDeMessagesParPage = 15;
        $nbr_post = $data['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>';
    }//Fin du else
    break;  ?>



alor je les modifier et la l' erreu et carément différente c' est Parse error: syntax error, unexpected T_VARIABLE in /dns/com/olympe-network/oxygeneteam/postok.php on line 155

voila le code modifier je ne voi pas la différence


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
<?php case "repondre":
    $message = $_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();
	$query=$db->prepare('SELECT topic_locked FROM forum_topic WHERE topic_id = :topic');
    $query->bindValue(':topic',$topic,PDO::PARAM_INT);
    $query->execute(); 
    $data=$query->fetch();
    if ($data['topic_locked'] != 0)
    {
        erreur(ERR_TOPIC_VERR); //A vous d'afficher un message du genre : le topic est verrouillé qu'est ce que tu fous là !?
    }
    $query->CloseCursor();

    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
        $query=$db->prepare('SELECT forum_id, topic_post FROM forum_topic WHERE topic_id = :topic');
        $query->bindValue(':topic', $topic, PDO::PARAM_INT);    
        $query->execute();
        $data=$query->fetch();
        $forum = $data['forum_id'];

        //Puis on entre le message
         $query=$db->prepare('INSERT INTO forum_post
        (post_createur, post_texte, post_time, topic_id, post_forum_id)
        VALUES(:id,:mess,:temps,:topic,:forum)');
        $query->bindValue(':id', $id, PDO::PARAM_INT);   
        $query->bindValue(':mess', $message, PDO::PARAM_STR);  
        $query->bindValue(':temps', $temps, PDO::PARAM_INT);  
        $query->bindValue(':topic', $topic, PDO::PARAM_INT);   
        $query->bindValue(':forum', $forum, PDO::PARAM_INT); 
        $query->execute()

        $nouveaupost = $db->lastInsertId();
        $query->CloseCursor(); 

        //On change un peu la table forum_topic
        $query=$db->prepare('UPDATE forum_topic SET topic_post = topic_post + 1, topic_last_post = :nouveaupost WHERE topic_id =:topic');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO::PARAM_INT);   
        $query->bindValue(':topic', (int) $topic, PDO::PARAM_INT); 
        $query->execute();
        $query->CloseCursor(); 

        //Puis même combat sur les 2 autres tables
        $query=$db->prepare('UPDATE forum_forum SET forum_post = forum_post + 1 , forum_last_post_id = :nouveaupost WHERE forum_id = :forum');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO::PARAM_INT);   
        $query->bindValue(':forum', (int) $forum, PDO::PARAM_INT); 
        $query->execute();
        $query->CloseCursor() 

        $query=$db->prepare('UPDATE forum_membres SET membre_post = membre_post + 1 WHERE membre_id = :id');
        $query->bindValue(':id', $id, PDO::PARAM_INT); 
        $query->execute();
        $query->CloseCursor(); 

        //Et un petit message
        $nombreDeMessagesParPage = 15;
        $nbr_post = $data['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>';
    }//Fin du else
    break; ?>
Hors ligne hendyhdi # Posté le 30/01/2012 à 20:10:03

Avis : Bon

t'a vérifier si t'avais mal défini les table de ta base de donée psk défois les beug vienne qu'on défini mal la base de donée dans son script

:p
Hors ligne hendyhdi # Posté le 30/01/2012 à 20:18:04

Avis : Bon

et en passant j'ai un gros problème avec la suprimation des topic et le plus gros est le problème avec l'affichage des pseudo dans se qu'on poste (quand on écrit un topic le pseudo du l'auteur ne veux pas s'afficher) help svp !!!

Voir tous les commentaires