Partage
  • Partager sur Facebook
  • Partager sur Twitter

Système de likes/dislikes

    22 mars 2019 à 17:28:04

    Bonjour, grâce à un tuto j'ai réussi à faire un système de likes et dislikes sur les articles rédigés. Il fonctionne très bien mais seulement quand on est sur la page de l'article à l'aide de son id.

    J'ai une main page où se trouvent plusieurs articles et j'aimerai qu'il y'ait aussi dessus le système de likes/dislikes.

    Malheureusement à cause du manque de compétences j'ai seulement réussi à afficher le nombre de likes mais sans le système en lui même. Aled

    Voici le code php du système: 

    Article.php

    <?php
    session_start();
    $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');
     }
     ?>

     L'affichage du code dans article.php: 

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

    Action.php

    <?php
    session_start();
    $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 = $_SESSION['id'];
       $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://localhost/fox/article.php?id='.$getid);
       } else {
          exit('Erreur fatale. <a href="http://localhost/fox/">Revenir à l\'accueil</a>');
       }
    } else {
       exit('Erreur fatale. <a href="http://localhost/fox/">Revenir à l\'accueil</a>');
    }
    ?>


    Voici la main page ou j'aimerai qu'il y'ait le système: 

    <?php
    session_start();
    $bdd = new PDO("mysql:host=127.0.0.1;dbname=articles;charset=utf8", "root", "");
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    
    
    $articles = $bdd->prepare('SELECT * FROM articles ORDER BY date_time_publication DESC LIMIT :nombre, :offset');
    $articles->bindValue(':nombre', $depart, PDO::PARAM_INT);
    $articles->bindValue(':offset', $articlesParPage, PDO::PARAM_INT);
    $articles->execute();
    
    setlocale(LC_TIME, 'fr');
    
    ?>


    L'affichage: 

        <?php while ($a = $articles->fetch()) {
        $dateArticle = new DateTime($a['date_time_publication']); 
        ?>
            <article class="article">
                <div class="article-content">
                <a href="article.php?id=<?= $a['id'] ?>"><img src="img_articles/<?= $a['id'] ?>.jpg" class="article-img" />
                <h1><a href="article.php?id=<?= $a['id'] ?>"><?= $a['titre'] ?></a></h1>
                <div class="article-date">Publié le <?= $dateArticle->format('d/m/Y') ?></div>
                <p><?= $a['contenu'] ?></p> 
                <div class="article-comment">Commentaires: 3</div>
                <a href="admin/redaction.php?edit=<?= $a['id'] ?>">Modifier</a> | <a href="supprimer.php?id=<?= $a['id'] ?>">Supprimer</a><br>
    
                </div>
            </article>
            <div class="article-hr"></div>
            <?php } ?>


    Il faut savoir que j'ai supprimé quelques lines de codes qui n'ont rien à voir avec ce système afin que ce soit plus agréable à lire


    -
    Edité par KubaKosior 22 mars 2019 à 17:31:42

    • Partager sur Facebook
    • Partager sur Twitter

    Je recherche un mentor afin de mieux progresser dans l'apprentissage du PHP et JS. Je suis pas trop chiant :D

      23 mars 2019 à 13:29:17

      Salut

      Peut tu me décrire ce qui ne fonctionne pas quand tu met ton système dans chaque article lors de la boucle ? 

      • Partager sur Facebook
      • Partager sur Twitter
        27 mars 2019 à 14:37:19

        Salut! 

        Alors en fait je bloque quand j'essaye de mettre le système d'id par rapport a l'article dans la boucle, je sais pas du tout comment m'y prendre

        J'arrive jusqu'ici : 

            <?php while ($a = $articles->fetch()) {
            $dateArticle = new DateTime($a['date_time_publication']);
            $id = $article['id'];
            $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(); 
            ?>
                <article class="article">
                    <div class="article-content">
                    <a href="article.php?id=<?= $a['id'] ?>"><img src="img_articles/<?= $a['id'] ?>.jpg" class="article-img" />
                    <h1><a href="article.php?id=<?= $a['id'] ?>"><?= $a['titre'] ?></a></h1>
                    <div class="article-date">Publié le <?= $dateArticle->format('d/m/Y') ?></div>
                    <p><?= $a['contenu'] ?></p> 
                    <div class="article-comment">Commentaires: 3</div>
                    <a href="php/action.php?t=1&id=<?= $id ?>">J'aime</a> (<?= $likes ?>)
                    <a href="php/action.php?t=2&id=<?= $id ?>">Je n'aime pas</a> (<?= $dislikes ?>) 
                    <br>
                    <a href="admin/redaction.php?edit=<?= $a['id'] ?>">Modifier</a> | <a href="supprimer.php?id=<?= $a['id'] ?>">Supprimer</a><br>
        
                    </div>
                </article>
                <div class="article-hr"></div>
                <?php } ?>


        Mais ensuite, c'est logique, la variable  $id n'est pas reconnu et quand j'essaye d'implanter le reste ca plante, j'ai essayé de plusieurs façons différentes sans réussite. Voici le reste du code que jdois implenter :

        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();

        Aled


        • Partager sur Facebook
        • Partager sur Twitter

        Je recherche un mentor afin de mieux progresser dans l'apprentissage du PHP et JS. Je suis pas trop chiant :D

          27 mars 2019 à 15:40:12

          Salut,

          déjà une seule requête pour les count sera plus efficace:

          select a.*,COUNT(l.id) AS nbLike,COUNT(dl.id) AS nbDisLike
          FROM article a
          LEFT JOIN like l ON a.id = l.id_article
          LEFT JOIN dislike dl ON a.id = dl.id_article
          

          A tester et tu boucle pour l'affichage, car là tu fait un nombre incalculable de requête => en PROD c'est mort même sur un dédié

          • Partager sur Facebook
          • Partager sur Twitter
            27 mars 2019 à 15:49:31

            Merci pour ta réponse mais j'ai rien compris :/
            • Partager sur Facebook
            • Partager sur Twitter

            Je recherche un mentor afin de mieux progresser dans l'apprentissage du PHP et JS. Je suis pas trop chiant :D

            Système de likes/dislikes

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown