• Aucun résultat trouvé

Traiter le message

Dans le document Créer son forum de toutes pièces (Page 63-66)

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

<?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

<?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

<?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.

Dans le document Créer son forum de toutes pièces (Page 63-66)