Tuto PHP - Système de likes et dislikes

PrimFX Boris ('PrimFX') Le 12 septembre 2016

On implémente un petit système de boutons "J'aime" / "Je n'aime pas" sur nos articles en PHP ! Bien sûr, il est tout à fait possible d'utiliser ce système sur d'autres types de posts (images, commentaires, etc.) pour laisser aux utilisateurs la possibilité d'exprimer leur avis ☺
  • article.php
<?php
$bdd = new PDO("mysql:host=127.0.0.1;dbname=articles;charset=utf8", "root", "");
if(isset($_GET['id']) AND !empty($_GET['id'])) {
   $get_id = htmlspecialchars($_GET['id']);
   $article = $bdd->prepare('SELECT * FROM articles WHERE id = ?');
   $article->execute(array($get_id));
   if($article->rowCount() == 1) {
      $article = $article->fetch();
      $id = $article['id'];
      $titre = $article['titre'];
      $contenu = $article['contenu'];
      $likes = $bdd->prepare('SELECT id FROM likes WHERE id_article = ?');
      $likes->execute(array($id));
      $likes = $likes->rowCount();
      $dislikes = $bdd->prepare('SELECT id FROM dislikes WHERE id_article = ?');
      $dislikes->execute(array($id));
      $dislikes = $dislikes->rowCount();
   } else {
      die('Cet article n\'existe pas !');
   }
} else {
   die('Erreur');
}
?>
<!DOCTYPE html>
<html>
<head>
   <title>Accueil</title>
   <meta charset="utf-8">
</head>
<body>
   <img src="miniatures/<?= $id ?>.jpg" width="400" />
   <h1><?= $titre ?></h1>
   <p><?= $contenu ?></p>
   <a href="php/action.php?t=1&id=<?= $id ?>">J'aime</a> (<?= $likes ?>)
   <br />
   <a href="php/action.php?t=2&id=<?= $id ?>">Je n'aime pas</a> (<?= $dislikes ?>) 
</body>
</html>
  • php/action.php
<?php
$bdd = new PDO("mysql:host=127.0.0.1;dbname=articles;charset=utf8", "root", "");
if(isset($_GET['t'],$_GET['id']) AND !empty($_GET['t']) AND !empty($_GET['id'])) {
   $getid = (int) $_GET['id'];
   $gett = (int) $_GET['t'];
   $sessionid = 5;
   $check = $bdd->prepare('SELECT id FROM articles WHERE id = ?');
   $check->execute(array($getid));
   if($check->rowCount() == 1) {
      if($gett == 1) {
         $check_like = $bdd->prepare('SELECT id FROM likes WHERE id_article = ? AND id_membre = ?');
         $check_like->execute(array($getid,$sessionid));
         $del = $bdd->prepare('DELETE FROM dislikes WHERE id_article = ? AND id_membre = ?');
         $del->execute(array($getid,$sessionid));
         if($check_like->rowCount() == 1) {
            $del = $bdd->prepare('DELETE FROM likes WHERE id_article = ? AND id_membre = ?');
            $del->execute(array($getid,$sessionid));
         } else {
            $ins = $bdd->prepare('INSERT INTO likes (id_article, id_membre) VALUES (?, ?)');
            $ins->execute(array($getid, $sessionid));
         }
         
      } elseif($gett == 2) {
         $check_like = $bdd->prepare('SELECT id FROM dislikes WHERE id_article = ? AND id_membre = ?');
         $check_like->execute(array($getid,$sessionid));
         $del = $bdd->prepare('DELETE FROM likes WHERE id_article = ? AND id_membre = ?');
         $del->execute(array($getid,$sessionid));
         if($check_like->rowCount() == 1) {
            $del = $bdd->prepare('DELETE FROM dislikes WHERE id_article = ? AND id_membre = ?');
            $del->execute(array($getid,$sessionid));
         } else {
            $ins = $bdd->prepare('INSERT INTO dislikes (id_article, id_membre) VALUES (?, ?)');
            $ins->execute(array($getid, $sessionid));
         }
      }
      header('Location: http://127.0.0.1/Tutos_PHP/Articles/article.php?id='.$getid);
   } else {
      exit('Erreur fatale. <a href="http://127.0.0.1/Tutos_PHP/Articles/">Revenir à l\'accueil</a>');
   }
} else {
   exit('Erreur fatale. <a href="http://127.0.0.1/Tutos_PHP/Articles/">Revenir à l\'accueil</a>');
}

A propos de l'auteur

PrimFX
Boris ('PrimFX')

Je m'appelle Boris, j'ai 22 ans et je suis passionné d'informatique. Suite à mes études (Licence Informatique puis MSc Computer Science au Trinity College Dublin), je gère l'entreprise Single Quote co-fondée en 2019 et je profite de mon temps libre pour partager ma passion à travers des vidéos & articles 😃

Votre commentaire

Vous devez être connecté pour poster un commentaire. Se connecter ou Créer un compte

Commentaires 12

  • Nisso Le 17 novembre, à 21:32 | Répondre

    franchement, j'ai regardé le tuto et franchement PHP est un language qui me terrifie je pense ne jamais en écrire.

  • Profil introuvable Le 19 octobre, à 06:47 | Répondre

    @Gng Pour sa je vous conseil d'allez voir cette vidéos TUTO PHP - Actualiser son code automatiquement (avec jQuery)

  • arCVuioz Le 27 septembre, à 17:30 | Répondre

    salut boris et ce que la bdd est dispo qqe part merci

  • Gng Le 13 août, à 15:45 | Répondre

    Pouvez-vous m'aider avec ce même tuto d'afficher le nombre de like sans rafraîchissement
    S'il-vous-plaît

  • EnderMC Le 12 mai, à 22:51 | Répondre

    @ZOZI c'est pas en spammant que tu vas trouver de l'aide - sinon tu demandes sur le forum

  • Jahzz Le 12 mai, à 21:46 (Édité le 13 mai 2020 à 16:41) | Répondre

    EDIT [résolu] : tout simplement oublié de faire un session-start sur le fichier action.php.


    Salut PrimeFX je déterre un peu ce tuto ^^
    j'ai un soucis avec le $sessionid pourquoi est il égal a 5 ? cela signifie que le système voit que c'est toujours le même sessionid qui est envoyé et donc impossible de mettre 2 like peu importe le membre.
    quand je change pour un autre nombre cela fonctionne j'ai donc essayer $sessionid = $_SESSION['id'];
    mais cela ne fonctionne pas. une idée pour me sortir de cette impasse ? :)

  • Moilee Le 28 mars, à 06:20 | Répondre

    Bjr , j'ai réécrit votre sur un système de like d'une photo quand un membre est connecté, donc j'ai ds les deux table (likes et dislikes) ,id,et id_membre, le id_membre récupère le id passer en paramètre par la page connexion, et tout marche ,sauf que je n'arrive pas a afficher tout les likes où dislikes de la base, je crois que ma requête que j'ai eu de vous a peut être une erreur ($likes =$bdd->prepare ('SELECT id FROM likes WHERE id_membre=?');
    $likes->execute(array($getid));
    $likes=$likes->rowCount();
    ) Quand un user est connecté il peut aimé ou pas , mais lorsque je me connecte avec un autre compte je ne vois pas son like ou dislikes, Merci de m'aider

  • ZOZI Le 5 mars, à 22:08 | Répondre

    Bonsoir ! il m'affiche Erreur ! c'est quoi le problème s'ils vous plait

  • ZOZI Le 5 mars, à 21:46 | Répondre

    Bonsoir ! il m'affiche Erreur ! c'est quoi le problème s'ils vous plait

  • manu Le 6 novembre, à 17:09 | Répondre

    Merci pour ce tuto très bien construit et comme d'habitude très bien expliqué.
    Pour aller plus loin serait-il possible de passer les infos en ajax à la façon de youtube ?
    Pour les textes pas de problème, mais le rechargement de la page interrompt les vidéos.
    Merci

  • samlaouni Le 25 septembre, à 10:18 | Répondre

    Merci pour les tutos frere et bon courage pour la suite

  • Ades03 Le 23 septembre, à 20:46 | Répondre

    À quand le tuto JS :D