Bonjour,

Voila je rencontre un petit problème avec mon code.

J'ai abandonné l'idée de votre tuto, car c'était beaucoup trop technique. Je vais faire un truc tout simple (à dire et pas à faire) :
Il y a un statut sur le mur de X. X clic sur le pouce pour aimer son statut. Alors, à côté de son pouce, un "1" s'affiche pour dire qu'il y a pour l'instant un seul utilisateur qui aime le statut. Une personne peut aimer qu'une seule fois le statut. Cette personne peut enlever le "j'aime" à tout moment pour le remplacer par un dislike ou bien par rien du tout.

Table votes : http://puu.sh/oBx4s/97764bf7e1.png
Table statut : http://puu.sh/oBx89/4fd2b84a62.png

Voiçi le code en question :

  $id = intval($_GET['id_utilisateur']);
  $req = $dbh->prepare('SELECT * FROM statut WHERE id_utilisateur = ?');
  $req->execute(array($id));
  $post = $req->fetch();
  $id_statut = $post['id_statut'];

  $req2 = $dbh->prepare('SELECT * FROM votes WHERE id_utilisateur = ?');
  $req2->execute(array($id));
  $value = $req2->fetch();
  $vote = $value['vote'];
  var_dump($vote);

  if(isset($_POST['like']) AND $vote['vote'] == 0)
  {
    if($_POST['like']) 
    {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
      $userlike = $like->fetch();
    }
  }
  else
  {
    $unlike = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (0,"'.$getid.'","'.$id_statut.'")');
    $unlike->execute();

  }
  if(isset($_POST['dislike']) AND $vote['vote'] == 0)
  {
    if($_POST['dislike']) 
    {
      $dislike = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $dislike->execute();
      $userdislike = $dislike->fetch();
    }
  }
  else
  {
    $undislike = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (0,"'.$getid.'","'.$id_statut.'")');
    $undislike->execute();
  }
                          <div class="vote">
                            <div class="vote_btns">
                              <form action="" method="POST" style="display: inline-block">
                                <button type="submit" class="vote_btn vote_like"><i class="material-icons" name = "like">thumb_up</i> <?php echo        $post['like_count'];?></button>
                              </form>
                              <form action="" method="POST" style="display: inline-block">
                                <button name="action2" type="submit" class="vote_btn vote_dislike"><i class="material-icons" name = "dislike">thumb_down</i> <?php echo $post['dislike_count'];?></button>
                              </form>
                            </div>
                          </div>

Voici les problème que j'ai : Ma bdd avant avoir rafraichis la page mur.php où les statuts et les like/dislike apparaissent : http://puu.sh/oBwUx/89bf092868.png
Après avoir rafraichis la page mur.php : http://puu.sh/oBwWP/02a9a748a9.png

Donc déjà il y a deux nouvelles lignes au lieu d'une seule, la valeur de vote ne change pas et enfin, l'id du statut reste le même malgré le fait que je clic sur 2 differents statuts ...

Avant toute chose je tiens à dire que j'ai essayer par moi même, je poste sur les forum en dernier recours ..

Cordialement

154 réponses


Carouge10
Réponse acceptée

Je viens de refaire ler test en créant le site chez moi.
Voici la boucle while:

<?php
                    // Préparation de la reqûete permettant de compter les votes en fonction du type de vote et du statut
                    $count = $dbh->prepare("SELECT * FROM votes WHERE vote = :vote AND id_statut = :statut");
                    ?>
                    <?php while($result = $q->fetch()) : ?>
                      <?php
                      $statut4 = $result['id_statut'];
                        // Count des likes
                      $count->execute(array(':vote' => '1', ':statut' => $statut4));
                      $compterlike = $count->rowCount();

                        // Cout des dislike
                      $count->execute(array(':vote' => '0', ':statut' => $statut4));
                      $compterdislike = $count->rowCount();
                      ?>
                      <div class="col s12 m12">
                        <div class="card blue-grey darken-1">
                          <div class="card-content white-text">
                            <span class="card-title"> <?php   echo $userinfo['nom'];
                                                                 echo " ";
                                                                 echo $userinfo['prenom']?> </span>

                            <p> <?= $result['description']; ?> </p>

                          </div>
                          <div class="card-action">
                            <a href="<?php echo 'commenter.php?id_utilisateur='.$userinfo['id_utilisateur'];?>">Commenter</a>
                            <div class="vote">
                              <div class="vote_btns">
                                  <a class="vote_btn volte_like" href="<?= 'mur2.php?vote=like&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$result['id_statut'];?>">
                                      <i class="material-icons" >thumb_up</i> <?php echo $compterlike;?>
                                  </a>
                                  <a class="vote_btn volte_dislike" href="<?= 'mur.php?vote=dislike&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$result['id_statut'];?>">
                                      <i class="material-icons" >thumb_down</i> <?php echo $compterdislike;?>
                                  </a>
                              </div>
                            </div>
                          </div>
                        </div>
                      </div>
                    <?php endwhile; ?>  

Plus qu'à faire l'idée précédente.
En tout cas, chez moi, ceci marche.

A demain.

Logique qu'il y est 2 insert puisque c'est ce que tu demandes et les $_POST sont vide à coup sur car je pense que le formulaire est faux.

Aranok
Auteur

Il faut que je fasse un if qui englobe le tout afin d'annuler le fait qu'il y ai 2 insert ?
A propos du formulaire, le faire comme ça est mieux non ?

                          <div class="vote">
                            <div class="vote_btns">
                              <form action="" method="POST" style="display: inline-block">
                                <button type="submit" class="vote_btn vote_like"><i class="material-icons" name = "like">thumb_up</i> <?php echo $post['like_count'];?></button>
                                <button name="action2" type="submit" class="vote_btn vote_dislike"><i class="material-icons" name = "dislike">thumb_down</i> <?php echo $post['dislike_count'];?></button>
                              </form>
                            </div>
                          </div>

Pour le form, c'est mieux avec deux avec ce style la :

<form action="" method="POST" style="display: inline-block">
    <input type="hidden" name="dislike" value="dislike">
                                <button type="submit" class="vote_btn vote_dislike"><i class="material-icons" name = "dislike">thumb_down</i> <?= $post['dislike_count']; ?></button>
                              </form>

Il faut juste faire, je pense, une requête pour liker et une pour dislike, non ?

Aranok
Auteur

Sur votre correction du form, il y a simplement le bouton "dislike" non ?
A propos des requêtes, en fait, une personne X peut aimer ou pas aimer le statut. S'il a déjà choisis d'aimer/pas aimer, il peut soit changer d'avis (mettre dislike alors qu'il avait mit like) ou bien en recliquant sur le choix qu'il a fait afin de ni aimer, ni pas aimer.

oui, je vous laisse adapter pour le "like".

Aranok
Auteur

ça donne ceci :

                              <form action="" method="POST" style="display: inline-block">
                                <input type="hidden" name="like" value="like">
                                  <button type="submit" class="vote_btn vote_like"><i class="material-icons" name = "like">thumb_up</i> <?php echo $post['like_count'];?></button>
                              </form>
                              <form action="" method="POST" style="display: inline-block">
                                <input type="hidden" name="dislike" value="dislike">
                                  <button type="submit" class="vote_btn vote_dislike"><i class="material-icons" name = "dislike">thumb_down</i> <?= $post['dislike_count']; ?></button>
                              </form>

A propos du SQL, comment puis-je éviter de faire 2 fois un insert ? Dois-je englober tous les if les uns dans les autres ?

Bonsoir.
Tu n'as pas compris, Carouge10 t'expliquais de faire un formulaire pour chacune des deux actions, un pour le like et un autre pour le dislike.

Aranok
Auteur

Au temps pour moi alors j'ai corrigé dans le message au dessus ^^

A propos du SQL, comment puis-je éviter de faire 2 fois un insert ? Dois-je englober tous les if les uns dans les autres ?

Si je like puis que j'enlève ce like, cela va toujours ajouter quelques choses à la BDD alors qu'il faudrais le mettre à zéro ou l'enlever, de même pour le dislike

Aranok
Auteur

Du coup faire un delete du vote, id_statut et id_utilisateur lorsqu'on veut enlever son like est la meilleure chose à faire ? Du coup dans les else, je devrai faire un delete ? Vous en pensez quoi ?

Je pense oui. A tester.

Aranok
Auteur

Je vais essayer, je poste le résultat dés que j'ai finis

Aranok
Auteur

J'ai dû supprimer quelques trucs afin qu'aucune erreur ne s'affiche, tel que

$userdislike = $dislike->fetch();
if(isset($_POST['dislike']) AND ($vote['vote'] == 0)) 
// par 
if(isset($_POST['dislike']) AND ($vote == 0))

Voici le code que j'ai :

  if(isset($_POST['like']) AND $vote == 0)
  {
    if($_POST['like']) 
    {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
    }
  }
  else
  {
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = ?, id_utilisateur = ?, id_statut = ?');
  }
  if(isset($_POST['dislike']) AND ($vote == 0))
  {
    if($_POST['dislike']) 
    {
      $dislike = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $dislike->execute();
      $userdislike = $dislike->fetch();
    }
  }
  else
  {
    $undislike = $dbh->prepare('DELETE FROM votes WHERE vote = ?, id_utilisateur = ?, id_statut = ?');
  }

Je n'ai plus les doublons, mais lorsque je clique sur like, voici ce qu'il y a dans ma bdd : http://puu.sh/oBIPV/d2c99284d7.png
Et lorsque je clic sur dislike après avoir appuyé sur like ça reste pareil, même lorsque je supprime la ligne de ma bdd et clic sur dislike, la valeur "vote" vaut toujours 1. Pareil pour l'id_statut, j'ai 2 differents statut sur mon mur, mais l'id reste le même ...
Et lorsqu'enfin je clic une nouvelle fois sur like, rien ne se supprime.

PS: j'ai même essayer ceci mais ça ne marche pas :
$unlike = $dbh->prepare('DELETE FROM votes WHERE vote = "'.$vote.'", id_utilisateur = "'.$getid.'", id_statut = "'.$id_statut.'"');

oui car vous avez préparé les requêtes sans les exécuter.
d'ailleur vous pourriez faire la même avec les "insert"

Aranok
Auteur

Pour les executer, j'ai utilisé ceci :

    $undislike->execute(array($vote,$getid,$id_statut));  //pour dislike
    $unlike->execute(array($vote,$getid,$id_statut)); // pour like

J'ai cette erreur que je ne connais pas : http://puu.sh/oBJGM/717794ee62.png
Mes insert je fais :

$like->execute();
$unlike->execute();

ça ne suffit pas ? DOis-je ajouter quelque chose ?

pour l'erreur j'ai besoin du nouveau code

Aranok
Auteur
<?php

session_start();

$bdd = 'mysql:host=localhost;dbname=sitesocialnetwork';
$user = 'root';
$password2 = '';
try{
  $dbh = new PDO($bdd, $user,$password2, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} 
catch (PDOException $e) {
    echo 'Echec de la connexion : ' . $e->getMessage();
    exit;
}

if(isset($_GET['id_utilisateur']) AND $_GET['id_utilisateur'] > 0)
{
    $getid = intval($_GET['id_utilisateur']); // sécuriser la valeur en nombre
    $requser = $dbh->prepare('SELECT * FROM utilisateurs WHERE id_utilisateur = ?');
    $requser->execute(array($getid));
    $userinfo = $requser->fetch();
    $q = $dbh->prepare('SELECT description, date_statut FROM statut WHERE id_utilisateur = ? ORDER BY date_statut DESC');
    $q->execute(array($getid));

  if(isset($_POST['action'])) // On récupére le statut dans la bdd
  {
    if($_POST['action'])
    {
      if(!empty($_POST['content']))
      {
        $id_statut=$_SESSION['id_utilisateur'];
        $content=htmlspecialchars($_POST['content']);
        $db = $dbh->prepare('INSERT INTO statut(description, id_utilisateur, date_statut) VALUES ("'.$content.'", "'.$getid.'", NOW())');
        $db->execute();
        $erreur = "Votre statut a été mis à jour !";
      }

    }
  }

  // php du like 
  $id = intval($_GET['id_utilisateur']);
  $req = $dbh->prepare('SELECT * FROM statut WHERE id_utilisateur = ?');
  $req->execute(array($id));
  $post = $req->fetch();
  $id_statut = $post['id_statut'];

  $req2 = $dbh->prepare('SELECT * FROM votes WHERE id_utilisateur = ?');
  $req2->execute(array($id));
  $value = $req2->fetch();
  $vote = $value['vote'];
  //var_dump($vote);

// 1 pour like et 0 pour dislike

  if(isset($_POST['like']) AND $vote == 0)
  {
    if($_POST['like']) 
    {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
    }
  }
  else
  {
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = ?, id_utilisateur = ?, id_statut = ?');
    $unlike->execute(array($vote,$getid,$id_statut));
    //$undislike->execute(array($_POST['dislike'],$_SESSION['id_utilisateur'],$result['id_statut']));

  }
  if(isset($_POST['dislike']) AND ($vote == 0))
  {
    if($_POST['dislike']) 
    {
      $dislike = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $dislike->execute();
      $userdislike = $dislike->fetch();
    }
  }
  else
  {
    $undislike = $dbh->prepare('DELETE FROM votes WHERE vote = ?, id_utilisateur = ?, id_statut = ?');
    $undislike->execute(array($vote,$getid,$id_statut)); 
  }

?>

C'est tout ma partie php vous avez besoins de mon html ?

il manque une } pour fermer le 1er if
On ne mets pas , dans les conditions mais un AND

Aranok
Auteur

C'est normal pour le 1er if, il se ferme à la toute fin du fichier, pour permettre aux membres et à personne d'autre de voir le contenu du fichier ^^
Où est ce que j'ai mis des virgules au lieu du AND ? :o

Ah d'accord, je pensais que le fichier était complet

Aranok
Auteur

Je vais essayer de chercher comment résoudre ça durant la nuit si je m'endors pas avant, ça fais 13h que je suis dessus je pense plutôt faire dodo et m'y remettre de bonheur demain ^^

Aranok
Auteur

Même en bindant ça m'affiche toujours la même erreur :

    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = :vote, id_utilisateur = :getid, id_statut = :id_statut');
    $unlike->execute(array(':vote' => $vote,':getid' => $getid,':id_statut' => $id_statut));
    $undislike = $dbh->prepare('DELETE FROM votes WHERE vote = :vote, id_utilisateur = :getid, id_statut = :id_statut');
    $undislike->execute(array(':vote' => $vote,':getid' => $getid,':id_statut' => $id_statut)); 
$unlike = $dbh->prepare('DELETE FROM votes WHERE vote = :vote AND id_utilisateur = :getid AND id_statut = :id_statut');
Aranok
Auteur

J'ai plus l'erreur. Lorsque j'appuie sur like, et ensuite je reclic sur like, il se supprime correctement. Par contre, lorsque je clic sur dislike, la valeur vaut 1 alors quelle doit valoir 0 mais elle se supprime bien lorsque je reclic dessus. L'id statut reste toujours le même lorsque je clic sur 2 statut different également :/

EDIT: Il vaut toujours à 1 car il passe d'abord par le 1er INSERT INTO non ? Il faut que j'englobe tout les if dans un seul if mais que dois-je mettre dedans ?

La c'est un problème d'insert. En relisant vaut insert, vous trouverez la solution.

Aranok
Auteur

Erreur tout bête repéré après 2s ! Merci ^^ Le seul problème qu'il reste est celui de l'id_statut. Comment faire pour que l'id_statut s'adapte au statut sur lequel on like/dislike ?

Simple, en ajoutant un input de type hidden dans chaque form avec l'id_statut.

Aranok
Auteur

Je ne pense pas que ça soit aussi simple que ça ?

<input type="hidden" name="id_statut" value="id_statut"> 

c'est presque ça.
id_statut correspond à l'id de l'élément où l'on peut liker ?

Aranok
Auteur

id_statut est une clé étrangére de la table votes ( http://puu.sh/oBOet/3ac48e6952.png )qui fait référence à l'id_statut de la table statut( http://puu.sh/oBOiY/b490fdf91a.png ). Donc ça correspond à l'id du statut sur lequel on like/unlike
Dois-je ajouter du php dans le input ?

un simple oui m'aurait suffit (^_^)
oui c'est ça

Aranok
Auteur

Je préfére être le plus prècis possible afin que les personnes puissent le mieux comprendre ^^

<input type="hidden" name="id_statut" value="<?php $value['id_statut'] ?>">

Je ne pense epas que ça soit ceci vue que ça me met une erreur ^^

Manque le ; et le echo (version longue ou short tag)

Aranok
Auteur
 <input type="hidden" name="id_statut" value="<?= $value['id_statut']; ?>">

Plus d'erreur mais lorsque j'aime un statut et que je dislike l'autre, ça m'enléve le like du 1er statut et le 2eme statut (que j'ai dislike) ne s'affiche même pas dans ma bdd

Un bon dodo et revoir demain à tête reposé ce qui ce passe. Car là c'est un problème de logique que de code.

Aranok
Auteur

Vous avez bien raison, je vais réessayer demain vers les coups de midi ! Bonne nuit à vous !

Merci à vous aussi.

Aranok
Auteur

Bonjour ! Après une bonne nuit de sommeil, vous m'avez dis de mettre un echo après le <?= , mais on ne cherche pas à l'afficher non?

oui exact. il est bien inscrit dans le value ?

Aranok
Auteur
<input type="hidden" name="id_statut" value="<?= echo $value['id_statut']; ?>">

Mais comme vous m'avez dit hier, j'ai une erreur de logique, c'est bien ça ?

oui, je pense. Vu que ça insère bien une valeur mais pas la bonne donc il faut relire le code et l'analyser pour vérifier qu'il fasse bien ce qu'on lui demande

Aranok
Auteur

Nous voulons bien l'id_statut de la table votes ?

oui, c'est ça

Aranok
Auteur

Pour moi, ça :

  $req2 = $dbh->prepare('SELECT * FROM votes WHERE id_utilisateur = ?');
  $req2->execute(array($id));
  $value = $req2->fetch();

Permet de mettre dans $value toutes les informations de la table votes dans la variable, et il sufit de faire $value['id_statut'] afin de récupérer l'id statut, mais lorsque je fais un var_dump sur ceci, il m'affiche qu'il est nul. Je dois ajouter un if qui permet de voir sur quelle id_statut nous sommes ? ça me semble la solution la plus probable :/

il faudrait vérifier que cette requête ne retourne qu'un enregistrement. Le fetch retourne seulement le 1er.
Il faut tester, avec un select, vous ne risquer pas de modifier vos données

Aranok
Auteur

Je m'y connais pas trop au niveau enregistrement, mais faut il utiliser un count() quelque part afin de voir combien d'enregistrement elle retourne ? je peux utiliser un fetchAll() du coup ?

un fetchall suivi d'un var_dump sur le résultat et vous aurez le nombre d'enregistrement retourné

avec le code, cela pourra m'aider (^_^)

Aranok
Auteur
 $id = intval($_GET['id_utilisateur']);
  $req = $dbh->prepare('SELECT * FROM statut WHERE id_utilisateur = ?');
  $req->execute(array($id));
  $post = $req->fetch();
  $id_statut = $post['id_statut'];

  $req2 = $dbh->prepare('SELECT * FROM votes WHERE id_utilisateur = ?');
  $req2->execute(array($id));
  $value = $req2->fetchAll();
  var_dump($value);
  $vote = $value['vote'];

  /*$req3 = $dbh->prepare('SELECT id_statut FROM votes WHERE id_utilisateur = ?');
  $req3->execute(array($id));
  $stat = $req3->fetch();
  $statutID = $stat['id_statut']; */

  // 1 pour like et 0 pour dislike
  if(isset($_POST['like']) AND $vote == 0)
  {
    if($_POST['like']) 
    {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
    }
  }
  else
  {
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = :vote AND id_utilisateur = :getid AND id_statut = :id_statut');
    $unlike->execute(array(':vote' => $vote,':getid' => $getid,':id_statut' => $id_statut));
    //$undislike->execute(array($_POST['dislike'],$_SESSION['id_utilisateur'],$result['id_statut']));

  }
  if(isset($_POST['dislike']) AND ($vote == 0))
  {
    if($_POST['dislike']) 
    {
      $dislike = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (0,"'.$getid.'","'.$id_statut.'")');
      $dislike->execute();
    }
  }
  else
  {
    $undislike = $dbh->prepare('DELETE FROM votes WHERE vote = :vote AND id_utilisateur = :getid AND id_statut = :id_statut');
    $undislike->execute(array(':vote' => $vote,':getid' => $getid,':id_statut' => $id_statut)); 
  }

il arrive d'où le $_GET['utilisateur'] car les formulaires like et dislike renvoie du post ?
Si on le test il affiche quelque chose ?

Aranok
Auteur
if(isset($_GET['id_utilisateur']) AND $_GET['id_utilisateur'] > 0)
{
    $getid = intval($_GET['id_utilisateur']); // sécuriser la valeur en nombre
    $requser = $dbh->prepare('SELECT * FROM utilisateurs WHERE id_utilisateur = ?');
    $requser->execute(array($getid));
    $userinfo = $requser->fetch();
    $q = $dbh->prepare('SELECT description, date_statut FROM statut WHERE id_utilisateur = ? ORDER BY date_statut DESC');
    $q->execute(array($getid));

  //Mettre un nouveau statut

  if(isset($_POST['action'])) // On récupére le statut dans la bdd
  {
    if($_POST['action'])
    {
      if(!empty($_POST['content']))
      {
        $id_statut=$_SESSION['id_utilisateur'];
        $content=htmlspecialchars($_POST['content']);
        $db = $dbh->prepare('INSERT INTO statut(description, id_utilisateur, date_statut) VALUES ("'.$content.'", "'.$getid.'", NOW())');
        $db->execute();
        $erreur = "Votre statut a été mis à jour !";
      }

    }
  }

  // php du like 
  $id = intval($_GET['id_utilisateur']);
  var_dump($_GET['id_utilisateur']);
  $req = $dbh->prepare('SELECT * FROM statut WHERE id_utilisateur = ?');
  $req->execute(array($id));
  $post = $req->fetch();
  $id_statut = $post['id_statut'];

  $req2 = $dbh->prepare('SELECT * FROM votes WHERE id_utilisateur = ?');
  $req2->execute(array($id));
  $value = $req2->fetchAll();
  //var_dump($value);
  $vote = $value['vote'];

  /*$req3 = $dbh->prepare('SELECT id_statut FROM votes WHERE id_utilisateur = ?');
  $req3->execute(array($id));
  $stat = $req3->fetch();
  $statutID = $stat['id_statut']; */

  // 1 pour like et 0 pour dislike
  if(isset($_POST['like']) AND $vote == 0)
  {
    if($_POST['like']) 
    {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
    }
  }
  else
  {
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = :vote AND id_utilisateur = :getid AND id_statut = :id_statut');
    $unlike->execute(array(':vote' => $vote,':getid' => $getid,':id_statut' => $id_statut));
    //$undislike->execute(array($_POST['dislike'],$_SESSION['id_utilisateur'],$result['id_statut']));

  }
  if(isset($_POST['dislike']) AND ($vote == 0))
  {
    if($_POST['dislike']) 
    {
      $dislike = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (0,"'.$getid.'","'.$id_statut.'")');
      $dislike->execute();
    }
  }
  else
  {
    $undislike = $dbh->prepare('DELETE FROM votes WHERE vote = :vote AND id_utilisateur = :getid AND id_statut = :id_statut');
    $undislike->execute(array(':vote' => $vote,':getid' => $getid,':id_statut' => $id_statut)); 
  }

C'est tout le code php de la page. Lorsque je fais un var_dump du $_GET['id_utilisateur'], il m'affiche l'id de l'utilisateur actuellement connecté.
Et voici a quoi ressemble ma page actuellement : http://puu.sh/oCkzH/b6a868a453.png

Donc nous avons $value['vote'] à null, c'est bien ça ?
Quelle est la différence entre $id et $getid ?

Aranok
Auteur

Pour le $id et $getid c'est la même chose, je l'avais supprimé dans un autre fichier j'ai oublie de le faire dans celui ci. Avec le fetchAll, j'ai cette erreur : http://puu.sh/oCmnD/4506de7449.png
Et avec fetch(), il est a nul oui.

avec le fetchall, il faut parcourir le résultat car c'est un tableau de tableau.
Par contre s'il renvoi null c'est qu'il n'a pas trouvé de donnée

Aranok
Auteur

Je me suis renseigné sur le net, faut il mettre une boucle while pour parcourir le fetchAll ? Et faut t'il mettre quelque chose dans les parenthéses du fetchAll ?

Il faut mettre quelque chose dans les parenthèse suivant ce que vous voulez qu'il retourne (objet, tableau....)
Pour parcourir le résultat il faut soit un while, soit un foreach

Aranok
Auteur
  while($value = $req2->fetchAll(PDO::FETCH_BOTH))
  {
    $tab[] = $value;
  }

Il faut ajouter quelque chose dans les crochets de tab je suppose ?

non cela va crée un tableau

Aranok
Auteur
  $req2 = $dbh->prepare('SELECT * FROM votes WHERE id_utilisateur = ?');
  $req2->execute(array($getid));
  while($value = $req2->fetchAll(PDO::FETCH_BOTH))
  {
    $tab = $value;
  }
  //var_dump($value);
  $vote = $value['vote'];
  var_dump($tab);

Ces 2 erreurs : http://puu.sh/oCqV2/64f9c3fc92.png

oula, le $vote = $value['vote'], il n'a lieu d'etre.
ll faut laisser le crochets à $tab dans le while pour avoir un tableau.

Enfin cela ne sert à rien puisque qu'on sait de base que la requête ne renvoi rien.
Vérifier dans phpmyadmin si vous avez un vote avec id_utilisateur que vous recherchez

Aranok
Auteur

A propos du $vote = $value['vote']; Je m'en servais dans mes DELETE FROM, faut que je les remplaces du coup.
Voilà ma BDD votes après avoir liker 1 statut avec 2 personnes différents (2 statuts differents) : http://puu.sh/oCrOF/84f4851dbc.png
Ceci réponds à votre question ?

oui tout a fait.
La questionque je viens de poser c'est comment vous faites dans la BDD pour différiencer un like d'un dislike ?
Car sauf erreur de ma part, les requêtes sont identique, que se soit l'un ou l'autre ?

Aranok
Auteur

Que ça soit like ou dislike, ils ont la même variable qui est vote. Sauf que pour les différenciés, j'utilise le système 0 et 1. 1 Pour like et 0 pour dislike. Serait-il mieux de créer une variable like et dislike ? Et si ces 2 variables sont à 0, ça veut dire que l'utilisateur n'a ni aimé ni dislike?

un peu de mal à suivre à force, lol.
J'essaye de comprendre la logique.
Je me pose la question de l'utiliter de récuper "vote" pour s'en servir d'en le DELETE

Dans la table votes, vote ne que peut être que 0 ou ?
Je ne sais pas si 2 variable like et dislike sont la solution.

Aranok
Auteur

Ma table vote :http://puu.sh/oCtCH/398b97a5ab.png
Lorsque vote = 1 ceci veut dire que l'utilisateur a cliquer sur le liker du statut, si le vote = 0 alors il a dislike.
Avez vous une idée de mieux représenter ceci ? ^^

La représentation me parait bien.
Je me pose la question de l'utiliter de récupérer "vote" pour s'en servir d'en le DELETE

Quand on enlève un like/dislike, il suffit d'enlever le vote = 0 (dislike) ou vote = 1 (like) dans la table votes où l'on id_statut = statut de l'id et id_utilisateur = id de l'utilisateur. ça ne serait pas cela, la solution ?

Aranok
Auteur

Vous dites d’enlever un like/dislike, ce n'est pas grâce au DELETE qu'on enlève justement ce like/dislike de la table votes ?

Si c'est bien cela. Mais pour l'enlever, je ne vois pas l'intérais de savoir la valeur de "vote" suivant id de l'utilisateur.
On sait qu'elle vaut 1 ou 0 suivant le bouton cliquer.

Aranok
Auteur

Donc dans le delete, il suffit de delete simplement le vote et non pas les 2 autres attributs ?

Non, l'inverse (^_^)
Voilà l'idée du delete.

// 1 pour like et 0 pour dislike
  if(isset($_POST['like']) AND $vote == 0)
  {
    if($_POST['like']) 
    {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
    }
  }
  else
  {
    // On enlève le "like" de l'utilisateur
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = 1 AND id_utilisateur = :getid AND id_statut = :id_statut');
    $unlike->execute(array(':getid' => $getid,':id_statut' => $id_statut));
    //$undislike->execute(array($_POST['dislike'],$_SESSION['id_utilisateur'],$result['id_statut']));

  }
  if(isset($_POST['dislike']) AND ($vote == 0))
  {
    if($_POST['dislike']) 
    {
      $dislike = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (0,"'.$getid.'","'.$id_statut.'")');
      $dislike->execute();
    }
  }
  else
  {
    // On enlève le "dislike" de l'utilisateur
    $undislike = $dbh->prepare('DELETE FROM votes WHERE vote = :vote AND id_utilisateur = :getid AND id_statut = :id_statut');
    $undislike->execute(array(':getid' => $getid,':id_statut' => $id_statut)); 
  }
Aranok
Auteur

J'ai changé le DELETE. Par contre, lorsque je clic sur Like, et que je reclic sur like voici ce qu'il se passe : http://puu.sh/oCwZ0/eb3436a9b0.png

Il fait 2 insert, c'est ça ?
Normalement quand vous cliquer sur "like", $vote ne devrait pas être null

Aranok
Auteur

J'ai cette erreur en haut de ma page : http://puu.sh/oCxkC/a5890cdba3.png

Je n'arrive pas à comprendre pourquoi il ne récupérer rien.

Aranok
Auteur

La ligne 56 c'est : $vote = $value['vote']; (j'avais cette erreur avant même d'avoir changé les DELETE, j'avais juste oublié de le mettre ^^)

oui je sais bien.
Ce que je ne comprends pas c'est qu'il devrait récupérer quelque chose quand on a liker ou disliker un statut.

Aranok
Auteur

Je reposte mon code, peut être que j'ai fais une faute sans le vouloir mais je n'ai rien vue :

$req = $dbh->prepare('SELECT * FROM statut WHERE id_utilisateur = ?');
  $req->execute(array($getid));
  $post = $req->fetch();
  $id_statut = $post['id_statut'];

  $req2 = $dbh->prepare('SELECT * FROM votes WHERE id_utilisateur = ?');
  $req2->execute(array($getid));
  while($value = $req2->fetchAll(PDO::FETCH_BOTH))
  {
    $tab[] = $value;
  }
  $vote = $value['vote'];

  // 1 pour like et 0 pour dislike
  if(isset($_POST['like']) AND $vote == 0)
  {
    if($_POST['like']) 
    {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
    }
  }
  else
  {
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = 1 AND id_utilisateur = :getid AND id_statut = :id_statut');
    $unlike->execute(array(':getid' => $getid,':id_statut' => $id_statut));
    //$undislike->execute(array($_POST['dislike'],$_SESSION['id_utilisateur'],$result['id_statut']));

  }
  if(isset($_POST['dislike']) AND ($vote == 0))
  {
    if($_POST['dislike']) 
    {
      $dislike = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (0,"'.$getid.'","'.$id_statut.'")');
      $dislike->execute();
    }
  }
  else
  {
    $undislike = $dbh->prepare('DELETE FROM votes WHERE vote = 0 AND id_utilisateur = :getid AND id_statut = :id_statut');
    $undislike->execute(array(':getid' => $getid,':id_statut' => $id_statut)); 
  }

On va reprendre point par point.

  • La 1ère requête récupère les statuts de l'utilisateur ?
  • Le 2ème récupére les votes de l'utilisateur ?
Aranok
Auteur

La 1er requête selectionne tout dans statut, et plus tard je selectionne juste l'id_statut.
La 2ème requête selectionne aussi tout dans votes et récupére aussi les votes de l'utilisateur.
Nous sommes d'accord ?

1/ Cela veut dire qu'on a 1 statut par utilisateur ?
2/ Cela veut dire qu'on récupérer tous les votes de l'utilisateur ?

Aranok
Auteur

1/ Justement l'utilisateur peut avoir autant de statut qu'il veut
2/ Comment ça récupérer tous les votes de l'utilisateur ? S'il vote sur plusieurs statut il faut bien récup les votes qu'il a fait non ?

Tu te complique la tache je trouve

voici un code fait vite fait pour comprendre

<?php

$rowcount = la valeur retourner tu doit prendre l id de la personne + le topic + like ou Dislike
$vote = 1 = like et 2 = dislike
if (!empty($_POST['vote']) AND intval($_POST['vote'])) {
    if($rowcount != 1){
        Insert into bla bla 
    }else{
        update table bla bla
    }
}
if ($rowcount == 1 AND $vote == 1) {
    echo 'Vous aimez ce contenue<br /><a href="?vote=2&id=1">Dislike</a>';
}elseif ($rowcount == 1 AND $vote == 2) {
    echo 'Vous n\'aimez pas ce contenue<br /><a href="?vote=1&id=1">Like</a>';
}else{
echo '<a href="?vote=1&id=1">Like</a>';
echo '<br /><a href="?vote=2&id=1">Dislike</a>';
}
?>
Aranok
Auteur

Je n'ai pas compris la variable $rowcount. Je dois faire une requête SQL dedans ? Et pour $vote, je récupére ce qu'il y a dans la bdd vote de la table votes ?

Aranok
Auteur

Pour vous répondre Carouge :

1/ Justement l'utilisateur peut avoir autant de statut qu'il veut
2/ Comment ça récupérer tous les votes de l'utilisateur ? S'il vote sur plusieurs statut il faut bien récup les votes qu'il a fait non ?

1/ ok, donc la on récupérer seulement son 1er statut (s'il en a un)
2/ Il ne devrait pas récupérer seulement les votes qu'il a fait (ou non) pour ce statut ?

Aranok
Auteur

Sachant qu'on peut voter qu'une fois (mais on peut changer son vote) mais sur differents statuts, il faut pouvoir récupérer ses votes sur tous les statuts

ça d'accord. La nous sommes bien en train de modifier les votes de seulement 1 statut.

Aranok
Auteur

Donc les problèmes actuel sont :
-Le fait d'aimer 2 fois le statut crée 2 votes differents, alors qu'il doit supprimer le 1er

  • Si j'aime un autre statut (id statut : 2), il va me mettre le vote sur l'id statut 1, du coup, ça me donne ceci (aimer le 1er statut, reaimer le 1er statut, aimer le 2eme statut ) : http://puu.sh/oDQnn/48a5b1301e.png

Le mieux serait de reprendre du formulaire et avancer pas à pas avec des var_dump pour vérifier que les données sont ceux qu'on souhaite

Aranok
Auteur

Voici le formulaire :

<form action="" method="POST" style="display: inline-block">
                                <input type="hidden" name="like" value="like">
                                <input type="hidden" name="id_statut" value="<?php echo $post['id_statut']; ?>">
                                  <button type="submit" class="vote_btn vote_like"><i class="material-icons" name = "like">thumb_up</i> <?php echo $post['like_count'];?></button>
                              </form>
                              <form action="" method="POST" style="display: inline-block">
                                <input type="hidden" name="dislike" value="dislike">
                                <input type="hidden" name="id_statut" value="<?php echo $post['id_statut']; ?>">
                                  <button type="submit" class="vote_btn vote_dislike"><i class="material-icons" name = "dislike">thumb_down</i> <?= $post['dislike_count']; ?></button>
                              </form>

Pour le php :

  $req = $dbh->prepare('SELECT * FROM statut WHERE id_utilisateur = ?');
  $req->execute(array($getid));
  $post = $req->fetch();
  $id_statut = $post['id_statut'];
  var_dump($id_statut);

  $req2 = $dbh->prepare('SELECT * FROM votes WHERE id_utilisateur = ?');
  $req2->execute(array($getid));
  while($value = $req2->fetchAll(PDO::FETCH_BOTH))
  {
    $tab[] = $value;
  }
  $vote = $value['vote'];

    // 1 pour like et 0 pour dislike
  if(isset($_POST['like']) AND $vote == 0)
  {
    if($_POST['like']) 
    {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
    }
  }
  else
  {
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = 1 AND id_utilisateur = :getid AND id_statut = :id_statut');
    $unlike->execute(array(':getid' => $getid,':id_statut' => $id_statut));
    //$undislike->execute(array($_POST['dislike'],$_SESSION['id_utilisateur'],$result['id_statut']));

  }
  if(isset($_POST['dislike']) AND ($vote == 0))
  {
    if($_POST['dislike']) 
    {
      $dislike = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (0,"'.$getid.'","'.$id_statut.'")');
      $dislike->execute();
    }
  }
  else
  {
    $undislike = $dbh->prepare('DELETE FROM votes WHERE vote = 0 AND id_utilisateur = :getid AND id_statut = :id_statut');
    $undislike->execute(array(':getid' => $getid,':id_statut' => $id_statut)); 
  } 

Par contre j'ai toujours cette erreur : http://puu.sh/oEkX3/8f4eaf0681.png

Le 1er select est inutile puisque qu'on récupère déjà l'id du statut par $_POST['id_statut'];
Pour le second, nous avons besoin seulement des votes de l'utilisateur pour ce statut (s'il y a)

Aranok
Auteur

Du coup j'enlève tout ça :

  $req = $dbh->prepare('SELECT * FROM statut WHERE id_utilisateur = ?');
  $req->execute(array($getid));
  $post = $req->fetch();
  $id_statut = $post['id_statut'];

Pour le 2eme SELECT, on a plus que ça ? :

  $req2 = $dbh->prepare('SELECT vote FROM votes WHERE id_utilisateur = ?');
  $req2->execute(array($getid));

Il faut aussi lui ajouter comme condition l'id du statut

Aranok
Auteur
  $req2 = $dbh->prepare('SELECT vote,id_statut FROM votes WHERE id_utilisateur = ?');
  $req2->execute(array($getid));

Du coup ça je l'enlève aussi :

  while($value = $req2->fetchAll(PDO::FETCH_BOTH))
  {
    $tab[] = $value;
  }
  $vote = $value['vote'];

Non, c'est pas l'id du statut qu'on veut pour la requête c'est le vote en fonction de l'id de l'utilisateur et de l'id du statut.

Aranok
Auteur

Du coup, pour récupérer l'id_staut, je peux faire :

  $ID = $_POST['id_statut']; 
  $req2 = $dbh->prepare('SELECT vote FROM votes WHERE id_utilisateur = ? AND id_statut = ?');
  $req2->execute(array($getid,$ID));

Mais j'ai ces erreur : http://puu.sh/oEIa0/997d297e12.png et http://puu.sh/oEIaW/354b250ecd.png

vue qu'on a supprimer la variable $post, et que je l'utilisé plus loin, ça me dit quelle existe pas ^^

Le formulaire et le php sont sur la même page ?

Aranok
Auteur

Oui, voici toute la page mur.php:

<?php

session_start();

$bdd = 'mysql:host=localhost;dbname=sitesocialnetwork';
$user = 'root';
$password2 = '';
try{
  $dbh = new PDO($bdd, $user,$password2, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} 
catch (PDOException $e) {
    echo 'Echec de la connexion : ' . $e->getMessage();
    exit;
}

if(isset($_GET['id_utilisateur']) AND $_GET['id_utilisateur'] > 0)
{
    $getid = intval($_GET['id_utilisateur']); // sécuriser la valeur en nombre
    $requser = $dbh->prepare('SELECT * FROM utilisateurs WHERE id_utilisateur = ?');
    $requser->execute(array($getid));
    $userinfo = $requser->fetch();
    $q = $dbh->prepare('SELECT description, date_statut FROM statut WHERE id_utilisateur = ? ORDER BY date_statut DESC');
    $q->execute(array($getid));

  //Mettre un nouveau statut

  if(isset($_POST['action'])) // On récupére le statut dans la bdd
  {
    if($_POST['action'])
    {
      if(!empty($_POST['content']))
      {
        $id_statut=$_SESSION['id_utilisateur'];
        $content=htmlspecialchars($_POST['content']);
        $db = $dbh->prepare('INSERT INTO statut(description, id_utilisateur, date_statut) VALUES ("'.$content.'", "'.$getid.'", NOW())');
        $db->execute();
        $erreur = "Votre statut a été mis à jour !";
      }

    }
  }

  // php du like 
  $ID = $_POST['id_statut'];
  $req2 = $dbh->prepare('SELECT vote FROM votes WHERE id_utilisateur = ? AND id_statut = ?');
  $req2->execute(array($getid,$ID));
  var_dump($ID);

    // 1 pour like et 0 pour dislike
  if(isset($_POST['like']) AND $vote == 0)
  {
    if($_POST['like']) 
    {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
       var_dump($vote);
    }
  }
  else
  {
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = 1 AND id_utilisateur = :getid AND id_statut = :id_statut');
    $unlike->execute(array(':getid' => $getid,':id_statut' => $id_statut));
    //$undislike->execute(array($_POST['dislike'],$_SESSION['id_utilisateur'],$result['id_statut']));

  }
  if(isset($_POST['dislike']) AND ($vote == 0))
  {
    if($_POST['dislike']) 
    {
      $dislike = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (0,"'.$getid.'","'.$id_statut.'")');
      $dislike->execute();
    }
  }
  else
  {
    $undislike = $dbh->prepare('DELETE FROM votes WHERE vote = 0 AND id_utilisateur = :getid AND id_statut = :id_statut');
    $undislike->execute(array(':getid' => $getid,':id_statut' => $id_statut)); 
  } 

?>

<!DOCTYPE html>
<html>
  <header>
    <meta charset="utf-8"/>
    <title>Profil de <?php  echo $userinfo['nom']; 
                            echo " ";
                            echo $userinfo['prenom']; ?></title>
    <link href="materialize.css" rel="stylesheet" media="all" type="text/css"> 
    <link href="footer.css" rel="stylesheet" media="all" type="text/css">
    <link href="like.css" rel="stylesheet" media="all" type="text/css">
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

  </header>
  <body>
    <main>
      <nav class ="blue darken-2">
        <div class=" nav-wrapper container">
          <a href="#!" class="brand-logo">TSN </a>

          <ul class="right">                    
            <li><a href="acceuil.php">Acceuil</a></li>
            <li><a href="<?php echo 'profil2.php?id_utilisateur='.$userinfo['id_utilisateur'];?>">Profile</a></li>
            <li><a href="choixMessage.php">Messages</a></li>
            <li><a href="deconnexion.php">Deconnexion</a></li>
          </ul>

        </div>
      </nav>

      <div id="profil">  
        <h4 align="center"> Profil de <?php  echo $userinfo['nom']; 
                              echo " ";
                              echo $userinfo['prenom']; ?> </h4><br>

        <center>                      
          <a class="waves-effect waves-light btn" href="<?php echo 'mur.php?id_utilisateur='.$getid.'';?>">Mur</a>
          <a class="waves-effect waves-light btn" href="<?php echo 'infoprofil.php?id_utilisateur='.$getid.'';?>">Informations</a>
          <a class="waves-effect waves-light btn" href="">Photos</a>
          <a class="waves-effect waves-light btn" href="">Amis</a>
                <?php 
                  if(isset($_SESSION['id_utilisateur']) AND $userinfo['id_utilisateur'] == $_SESSION['id_utilisateur'])
                  {
                  ?>
                    <a class="waves-effect waves-light btn" href="editionprofil.php">Editer mon profil</a>
                <?php
                }
                ?>
        </center><br><br>
        <div class="container">
          <div class="row">                        
            <div class="col s12 m4 l4"><p>
                  <?php 
                    if(!empty($userinfo['photo_profil']))
                    {
                  ?>
                  <img src="membre/photoProfil/<?php echo $userinfo['photo_profil']; ?>" class="materialboxed" width="200">
                  <?php
                    }
                  ?> <br>

              <div class="input-field col s12 m4 l4">
                <label for="newtel">Date d'inscription'</label>
                <input disabled value="<?php echo $userinfo['date_inscription'];?>" id="disabled" type="text" class="validate">
              </div>
            </p></div>

                      <!-- Envoyer un statut -->

              <div class="col s12 m4 l5"><p>
                <?php if(isset($_SESSION['id_utilisateur']) AND $userinfo['id_utilisateur'] == $_SESSION['id_utilisateur']){ ?>
                  <div class="row">
                    <form class="col s12" action="" method="post">
                      <div class="row">
                        <div class="input-field col s12">
                          <textarea name="content" class="materialize-textarea"></textarea>
                          <label for="textarea1">Statut</label>
                        </div>
                      </div>

                      <!-- -->
                      <!-- Envoyer une photo en statut 
                      <?php  ?>
                      <form action="#">
                        <div class="file-field input-field">
                          <div class="btn">
                            <span>Photo</span>
                            <input type="file" name="photo">
                          </div>
                          <div class="file-path-wrapper">
                            <input class="file-path validate" type="text">
                          </div>
                        </div>
                      </form> -->

                      <!--  -->

                    <button class="btn waves-effect waves-light" type="submit" name="action" value="Envoyer">
                      <i class="material-icons center">Envoyer</i>
                    </button>
                    </form>
                  </div>
                  <div class="row">
                    <?php while($result = $q->fetch()) { ?>
                      <div class="col s12 m12">
                        <div class="card blue-grey darken-1">
                          <div class="card-content white-text">
                            <span class="card-title"> <?php   echo $userinfo['nom'];
                                                                 echo " ";
                                                                 echo $userinfo['prenom']?> </span>

                            <p> <?php echo $result['description']; ?> </p>

                          </div>
                          <div class="card-action">
                            <a href="<?php echo 'commenter.php?id_utilisateur='.$userinfo['id_utilisateur'];?>">Commenter</a>
                          <div class="vote">
                            <div class="vote_btns">
                              <form action="" method="POST" style="display: inline-block">
                                <input type="hidden" name="like" value="like">
                                <input type="hidden" name="id_statut" value="<?php echo $post['id_statut']; ?>">
                                  <button type="submit" class="vote_btn vote_like"><i class="material-icons" name = "like">thumb_up</i> <?php echo $post['like_count'];?></button>
                              </form>
                              <form action="" method="POST" style="display: inline-block">
                                <input type="hidden" name="dislike" value="dislike">
                                <input type="hidden" name="id_statut" value="<?php echo $post['id_statut']; ?>">
                                  <button type="submit" class="vote_btn vote_dislike"><i class="material-icons" name = "dislike">thumb_down</i> <?= $post['dislike_count']; ?></button>
                              </form>
                            </div>
                          </div>
                          </div>
                        </div>
                      </div>
                    <?php } ?>                    
                  </div>
              </p></div>
              <?php } ?>
          </div>
        </div>
      </div>
      <center>
                    <?php
              if(isset($erreur))
              {
                echo '<font color="red">'.$erreur."</font>";
              }
            ?>
      </center>
      <br>
    </main>     
    <footer class ="page-footer blue darken-2">
      <div class="footer-copyright">
        Copyright &copy; 2016 the | All rights reserved
      </div>
    </footer>

    <!-- SCRIPT -->

    <script src="js/jquery.timeago.js"></script>
    <script src="js/jquery.timeago.fr.js"></script>
    <script src="js/jquery.livequery.min.js"></script>
    <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script src="js/materialize.js"></script>
    <script src="js/init.js"></script>
    <script type="text/javascript">
      window.ParleyValidator.setLocale('fr');
      $(document).ready(function) {
        $("span.timeago").timeago();
      });
  </body>
</html>
<?php
}
?>

Je regarde cela en rentrant.

Aranok
Auteur

Pas de soucis ;)

Voilà j'ai refais le code pour mieux le comprendre (avec des commantaires)
J'ai corrigé des défauts graves de syntaxe car le css, js ce met dans la balise "head" et non "header", et il avait des balises fermante de "p" qui se baladait sans être ouverte.

<?php

session_start();

$bdd = 'mysql:host=localhost;dbname=sitesocialnetwork';
$user = 'root';
$password2 = '';
try{
  $dbh = new PDO($bdd, $user,$password2, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} 
catch (PDOException $e) {
    echo 'Echec de la connexion : ' . $e->getMessage();
    exit;
}

if(isset($_GET['id_utilisateur']) AND $_GET['id_utilisateur'] > 0)
{
    $getid = intval($_GET['id_utilisateur']); // sécuriser la valeur en nombre
    $requser = $dbh->prepare('SELECT * FROM utilisateurs WHERE id_utilisateur = ?');
    $requser->execute(array($getid));

    $userinfo = $requser->fetch();
    $q = $dbh->prepare('SELECT description, date_statut FROM statut WHERE id_utilisateur = ? ORDER BY date_statut DESC');
    $q->execute(array($getid));

  //Mettre un nouveau statut

  if(isset($_POST['action'])) // On récupére le statut dans la bdd
  {
    if($_POST['action'])
    {
      if(!empty($_POST['content']))
      {
        $id_statut=$_SESSION['id_utilisateur'];
        $content=htmlspecialchars($_POST['content']);
        $db = $dbh->prepare('INSERT INTO statut(description, id_utilisateur, date_statut) VALUES ("'.$content.'", "'.$getid.'", NOW())');
        $db->execute();
        $erreur = "Votre statut a été mis à jour !";
      }

    }
  }

  // php du like 
  $ID = $_GET['id_statut'];
  $req2 = $dbh->prepare('SELECT vote FROM votes WHERE id_utilisateur = ? AND id_statut = ?');
  $req2->execute(array($getid,$ID));
  var_dump($req2);
  $vote = $req2->fetch();

    // 1 pour like et 0 pour dislike

  // Si le mode de vote est "like" et qu'aucun vote n'est renseigné
  // Alors on met "like"
  if(isset($_GET['vote']) && $_GET['vote'] == 'like' && empty($vote))
  {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
  }
  // Si le mode de vote est "like" et que le vote vaut 1
  // Alors on enlève le "like"
  elseif (isset($_GET['vote']) && $_GET['vote'] == 'like' && $vote['vote'] == 1)
  {
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = 1 AND id_utilisateur = :getid AND id_statut = :id_statut');
    $unlike->execute(array(':getid' => $getid,':id_statut' => $id_statut));
    //$undislike->execute(array($_POST['dislike'],$_SESSION['id_utilisateur'],$result['id_statut']));

  }

  // Si le mode de vote est "dislike" et qu'aucun vote n'est renseigné
  // Alors on met "dislike"
  elseif(isset($_GET['vote']) && $_GET['vote'] == 'dislike' && empty($vote))
  {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (0,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
  }
  // Si le mode de vote est "dislike" et que le vote vaut 1
  // Alors on enlève le "dislike"
  elseif (isset($_GET['vote']) && $_GET['vote'] == 'dislike' && $vote['vote'] == 0)
  {
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = 0 AND id_utilisateur = :getid AND id_statut = :id_statut');
    $unlike->execute(array(':getid' => $getid,':id_statut' => $id_statut));
    //$undislike->execute(array($_POST['dislike'],$_SESSION['id_utilisateur'],$result['id_statut']));

  }

?>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Profil de <?php  echo $userinfo['nom']; 
                            echo " ";
                            echo $userinfo['prenom']; ?></title>
    <link href="materialize.css" rel="stylesheet" media="all" type="text/css"> 
    <link href="footer.css" rel="stylesheet" media="all" type="text/css">
    <link href="like.css" rel="stylesheet" media="all" type="text/css">
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

  </head>
  <body>
    <main>
      <nav class ="blue darken-2">
        <div class=" nav-wrapper container">
          <a href="#!" class="brand-logo">TSN </a>

          <ul class="right">                    
            <li><a href="acceuil.php">Acceuil</a></li>
            <li><a href="<?php echo 'profil2.php?id_utilisateur='.$userinfo['id_utilisateur'];?>">Profile</a></li>
            <li><a href="choixMessage.php">Messages</a></li>
            <li><a href="deconnexion.php">Deconnexion</a></li>
          </ul>

        </div>
      </nav>

      <div id="profil">  
        <h4 align="center"> Profil de <?php  echo $userinfo['nom']; 
                              echo " ";
                              echo $userinfo['prenom']; ?> </h4><br>

        <center>                      
          <a class="waves-effect waves-light btn" href="<?php echo 'mur.php?id_utilisateur='.$getid.'';?>">Mur</a>
          <a class="waves-effect waves-light btn" href="<?php echo 'infoprofil.php?id_utilisateur='.$getid.'';?>">Informations</a>
          <a class="waves-effect waves-light btn" href="">Photos</a>
          <a class="waves-effect waves-light btn" href="">Amis</a>
                <?php 
                  if(isset($_SESSION['id_utilisateur']) AND $userinfo['id_utilisateur'] == $_SESSION['id_utilisateur'])
                  {
                  ?>
                    <a class="waves-effect waves-light btn" href="editionprofil.php">Editer mon profil</a>
                <?php
                }
                ?>
        </center><br><br>
        <div class="container">
          <div class="row">                        
            <div class="col s12 m4 l4"><p>
                  <?php 
                    if(!empty($userinfo['photo_profil']))
                    {
                  ?>
                  <img src="membre/photoProfil/<?php echo $userinfo['photo_profil']; ?>" class="materialboxed" width="200">
                  <?php
                    }
                  ?> <br>

              <div class="input-field col s12 m4 l4">
                <label for="newtel">Date d'inscription'</label>
                <input disabled value="<?php echo $userinfo['date_inscription'];?>" id="disabled" type="text" class="validate">
              </div>
            </div>

                      <!-- Envoyer un statut -->

              <div class="col s12 m4 l5"><p>
                <?php if(isset($_SESSION['id_utilisateur']) AND $userinfo['id_utilisateur'] == $_SESSION['id_utilisateur']){ ?>
                  <div class="row">
                    <form class="col s12" action="" method="post">
                      <div class="row">
                        <div class="input-field col s12">
                          <textarea name="content" class="materialize-textarea"></textarea>
                          <label for="textarea1">Statut</label>
                        </div>
                      </div>

                      <!-- -->
                      <!-- Envoyer une photo en statut 
                      <?php  ?>
                      <form action="#">
                        <div class="file-field input-field">
                          <div class="btn">
                            <span>Photo</span>
                            <input type="file" name="photo">
                          </div>
                          <div class="file-path-wrapper">
                            <input class="file-path validate" type="text">
                          </div>
                        </div>
                      </form> -->

                      <!--  -->

                    <button class="btn waves-effect waves-light" type="submit" name="action" value="Envoyer">
                      <i class="material-icons center">Envoyer</i>
                    </button>
                    </form>
                  </div>
                  <div class="row">
                    <?php while($result = $q->fetch()) { ?>
                      <div class="col s12 m12">
                        <div class="card blue-grey darken-1">
                          <div class="card-content white-text">
                            <span class="card-title"> <?php   echo $userinfo['nom'];
                                                                 echo " ";
                                                                 echo $userinfo['prenom']?> </span>

                            <p> <?php echo $result['description']; ?> </p>

                          </div>
                          <div class="card-action">
                            <a href="<?php echo 'commenter.php?id_utilisateur='.$userinfo['id_utilisateur'];?>">Commenter</a>
                            <div class="vote">
                              <div class="vote_btns">
                                  <a class="vote_btn volte_like" href="<?= 'mur.php?vote=like&id_utilisateur='.$getid.'&id_statut='.$post['id_statut'];?>">
                                      <i class="material-icons" >thumb_up</i> <?php echo $post['like_count'];?>
                                  </a>
                                  <a class="vote_btn volte_dislike" href="<?= 'mur.php?vote=like&id_utilisateur='.$getid.'&id_statut='.$post['id_statut'];?>">
                                      <i class="material-icons" >thumb_down</i> <?php echo $post['dislike_count'];?>
                                  </a>
                              </div>
                            </div>
                          </div>
                        </div>
                      </div>
                    <?php } ?>                    
                  </div>
              </div>
              <?php } ?>
          </div>
        </div>
      </div>
      <center>
        <?php
        if(isset($erreur))
        {
          echo '<font color="red">'.$erreur."</font>";
        }
      ?>
      </center>
      <br>
    </main>     
    <footer class ="page-footer blue darken-2">
      <div class="footer-copyright">
        Copyright &copy; 2016 the | All rights reserved
      </div>
    </footer>

    <!-- SCRIPT -->

    <script src="js/jquery.timeago.js"></script>
    <script src="js/jquery.timeago.fr.js"></script>
    <script src="js/jquery.livequery.min.js"></script>
    <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script src="js/materialize.js"></script>
    <script src="js/init.js"></script>
    <script type="text/javascript">
      window.ParleyValidator.setLocale('fr');
      $(document).ready(function) {
        $("span.timeago").timeago();
      });
    </script>
  </body>
</html>
<?php
}
?>

Ce que j'ai fait, gère le faite qu'on ne peut pas "liker" et "disliker" le statut (il n'affiche aucune erreur à si on tente de le faire)

Aranok
Auteur

Tout d'abord, je tiens encore à vous remercier pour votre aide, c'est vraiment très sympatique de votre part.
J'ai changé le code, mais voici 2 erreur : http://puu.sh/oEVOa/87cff20a81.png et http://puu.sh/oEVRC/5640a15fd7.png

Voilà une nouvelle correction. Je n'avais pas lu le code en entier et j'avais pris certaines de vos variables que je pensais bonnes

<?php

session_start();

$bdd = 'mysql:host=localhost;dbname=sitesocialnetwork';
$user = 'root';
$password2 = '';
try{
  $dbh = new PDO($bdd, $user,$password2, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} 
catch (PDOException $e) {
    echo 'Echec de la connexion : ' . $e->getMessage();
    exit;
}

if(isset($_GET['id_utilisateur']) AND $_GET['id_utilisateur'] > 0)
{
    $getid = intval($_GET['id_utilisateur']); // sécuriser la valeur en nombre
    $requser = $dbh->prepare('SELECT * FROM utilisateurs WHERE id_utilisateur = ?');
    $requser->execute(array($getid));

    $userinfo = $requser->fetch();
    $q = $dbh->prepare('SELECT description, date_statut FROM statut WHERE id_utilisateur = ? ORDER BY date_statut DESC');
    $q->execute(array($getid));

  //Mettre un nouveau statut

  if(isset($_POST['action'])) // On récupére le statut dans la bdd
  {
    if($_POST['action'])
    {
      if(!empty($_POST['content']))
      {
        $id_statut=$_SESSION['id_utilisateur'];
        $content=htmlspecialchars($_POST['content']);
        $db = $dbh->prepare('INSERT INTO statut(description, id_utilisateur, date_statut) VALUES ("'.$content.'", "'.$getid.'", NOW())');
        $db->execute();
        $erreur = "Votre statut a été mis à jour !";
      }

    }
  }

  // php du like 
  $ID = $_GET['id_statut'];
  $req2 = $dbh->prepare('SELECT vote FROM votes WHERE id_utilisateur = ? AND id_statut = ?');
  $req2->execute(array($getid,$ID));
  var_dump($req2);
  $vote = $req2->fetch();

    // 1 pour like et 0 pour dislike

  // Si le mode de vote est "like" et qu'aucun vote n'est renseigné
  // Alors on met "like"
  if(isset($_GET['vote']) && $_GET['vote'] == 'like' && empty($vote))
  {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (1,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
  }
  // Si le mode de vote est "like" et que le vote vaut 1
  // Alors on enlève le "like"
  elseif (isset($_GET['vote']) && $_GET['vote'] == 'like' && $vote['vote'] == 1)
  {
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = 1 AND id_utilisateur = :getid AND id_statut = :id_statut');
    $unlike->execute(array(':getid' => $getid,':id_statut' => $id_statut));
    //$undislike->execute(array($_POST['dislike'],$_SESSION['id_utilisateur'],$result['id_statut']));

  }

  // Si le mode de vote est "dislike" et qu'aucun vote n'est renseigné
  // Alors on met "dislike"
  elseif(isset($_GET['vote']) && $_GET['vote'] == 'dislike' && empty($vote))
  {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (0,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
  }
  // Si le mode de vote est "dislike" et que le vote vaut 1
  // Alors on enlève le "dislike"
  elseif (isset($_GET['vote']) && $_GET['vote'] == 'dislike' && $vote['vote'] == 0)
  {
    $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = 0 AND id_utilisateur = :getid AND id_statut = :id_statut');
    $unlike->execute(array(':getid' => $getid,':id_statut' => $id_statut));
    //$undislike->execute(array($_POST['dislike'],$_SESSION['id_utilisateur'],$result['id_statut']));

  }

?>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Profil de <?php  echo $userinfo['nom']; 
                            echo " ";
                            echo $userinfo['prenom']; ?></title>
    <link href="materialize.css" rel="stylesheet" media="all" type="text/css"> 
    <link href="footer.css" rel="stylesheet" media="all" type="text/css">
    <link href="like.css" rel="stylesheet" media="all" type="text/css">
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

  </head>
  <body>
    <main>
      <nav class ="blue darken-2">
        <div class=" nav-wrapper container">
          <a href="#!" class="brand-logo">TSN </a>

          <ul class="right">                    
            <li><a href="acceuil.php">Acceuil</a></li>
            <li><a href="<?php echo 'profil2.php?id_utilisateur='.$userinfo['id_utilisateur'];?>">Profile</a></li>
            <li><a href="choixMessage.php">Messages</a></li>
            <li><a href="deconnexion.php">Deconnexion</a></li>
          </ul>

        </div>
      </nav>

      <div id="profil">  
        <h4 align="center"> Profil de <?php  echo $userinfo['nom']; 
                              echo " ";
                              echo $userinfo['prenom']; ?> </h4><br>

        <center>                      
          <a class="waves-effect waves-light btn" href="<?php echo 'mur.php?id_utilisateur='.$getid.'';?>">Mur</a>
          <a class="waves-effect waves-light btn" href="<?php echo 'infoprofil.php?id_utilisateur='.$getid.'';?>">Informations</a>
          <a class="waves-effect waves-light btn" href="">Photos</a>
          <a class="waves-effect waves-light btn" href="">Amis</a>
                <?php 
                  if(isset($_SESSION['id_utilisateur']) AND $userinfo['id_utilisateur'] == $_SESSION['id_utilisateur'])
                  {
                  ?>
                    <a class="waves-effect waves-light btn" href="editionprofil.php">Editer mon profil</a>
                <?php
                }
                ?>
        </center><br><br>
        <div class="container">
          <div class="row">                        
            <div class="col s12 m4 l4"><p>
                  <?php 
                    if(!empty($userinfo['photo_profil']))
                    {
                  ?>
                  <img src="membre/photoProfil/<?php echo $userinfo['photo_profil']; ?>" class="materialboxed" width="200">
                  <?php
                    }
                  ?> <br>

              <div class="input-field col s12 m4 l4">
                <label for="newtel">Date d'inscription'</label>
                <input disabled value="<?php echo $userinfo['date_inscription'];?>" id="disabled" type="text" class="validate">
              </div>
            </div>

                      <!-- Envoyer un statut -->

              <div class="col s12 m4 l5"><p>
                <?php if(isset($_SESSION['id_utilisateur']) AND $userinfo['id_utilisateur'] == $_SESSION['id_utilisateur']){ ?>
                  <div class="row">
                    <form class="col s12" action="" method="post">
                      <div class="row">
                        <div class="input-field col s12">
                          <textarea name="content" class="materialize-textarea"></textarea>
                          <label for="textarea1">Statut</label>
                        </div>
                      </div>

                      <!-- -->
                      <!-- Envoyer une photo en statut 
                      <?php  ?>
                      <form action="#">
                        <div class="file-field input-field">
                          <div class="btn">
                            <span>Photo</span>
                            <input type="file" name="photo">
                          </div>
                          <div class="file-path-wrapper">
                            <input class="file-path validate" type="text">
                          </div>
                        </div>
                      </form> -->

                      <!--  -->

                    <button class="btn waves-effect waves-light" type="submit" name="action" value="Envoyer">
                      <i class="material-icons center">Envoyer</i>
                    </button>
                    </form>
                  </div>
                  <div class="row">
                    <?php while($result = $q->fetch()) { ?>
                      <div class="col s12 m12">
                        <div class="card blue-grey darken-1">
                          <div class="card-content white-text">
                            <span class="card-title"> <?php   echo $userinfo['nom'];
                                                                 echo " ";
                                                                 echo $userinfo['prenom']?> </span>

                            <p> <?php echo $result['description']; ?> </p>

                          </div>
                          <div class="card-action">
                            <a href="<?php echo 'commenter.php?id_utilisateur='.$userinfo['id_utilisateur'];?>">Commenter</a>
                            <div class="vote">
                              <div class="vote_btns">
                                  <a class="vote_btn volte_like" href="<?= 'mur.php?vote=like&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$result['id_statut'];?>">
                                      <i class="material-icons" >thumb_up</i> <?php echo $result['like_count'];?>
                                  </a>
                                  <a class="vote_btn volte_dislike" href="<?= 'mur.php?vote=like&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$result['id_statut'];?>">
                                      <i class="material-icons" >thumb_down</i> <?php echo $result['dislike_count'];?>
                                  </a>
                              </div>
                            </div>
                          </div>
                        </div>
                      </div>
                    <?php } ?>                    
                  </div>
              </div>
              <?php } ?>
          </div>
        </div>
      </div>
      <center>
        <?php
        if(isset($erreur))
        {
          echo '<font color="red">'.$erreur."</font>";
        }
      ?>
      </center>
      <br>
    </main>     
    <footer class ="page-footer blue darken-2">
      <div class="footer-copyright">
        Copyright &copy; 2016 the | All rights reserved
      </div>
    </footer>

    <!-- SCRIPT -->

    <script src="js/jquery.timeago.js"></script>
    <script src="js/jquery.timeago.fr.js"></script>
    <script src="js/jquery.livequery.min.js"></script>
    <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script src="js/materialize.js"></script>
    <script src="js/init.js"></script>
    <script type="text/javascript">
      window.ParleyValidator.setLocale('fr');
      $(document).ready(function) {
        $("span.timeago").timeago();
      });
    </script>
  </body>
</html>
<?php
}
?>
Aranok
Auteur

J'ai toujours la 1er erreur et la deuxiéme est pratiquement la même que tout à l'heure : http://puu.sh/oEWwF/d33120d999.png

Je reviens dans 45min, je dois chercher mon frère !

ok, la ligne 23 en remplaçant par :

$q = $dbh->prepare('SELECT * FROM statut WHERE id_utilisateur = ? ORDER BY date_statut DESC');

devrait résoudre en partie notre problème.

Pour ceux qui est des count des like et dislike, là c'est normale car il va faloir faire 2 requêtes dans le while qui va compter les like et les dislike pour le statut.

Aranok
Auteur

J'ai remplcé la ligne, il y a encore l'erreur : http://puu.sh/oF12r/dedfaf8d0f.png
Mais l'erreur qui était sur commentaire a disparu.

J'ai compris l'erreur.
Lors du chargement des statuts, on ne connais pas l'id_statut ce qui en sommes est logique.
Il faut encadrer la partie "like/dislike" par un test sur l'existence du $_GET['id_statut']

Aranok
Auteur

Effectivement, c'est bien ça. Lorsque j'appuie sur like/dislike, cette erreur apparaît : http://puu.sh/oF3np/37bc88ac4e.png

Il est bien renseigné dans le lien des like et dislike ?

oublier m'a question, la réponse est oui.
On récupère le get id_statut pour le mettre dans $ID et après on utilise une variable $id_statut.
Changer les 2 $ID en $id_statut

Aranok
Auteur

Vous avez tout à fait raison, les problèmes ont disparu.
Vue que lorsque je like/dislike un statut rien n'apparaît dans ma bdd, nous devons traiter cette partie là désormais ?

ah oui, normalement ça devrait.
mettez un echo dans chaque if et voyez si le bon s'affiche

Aranok
Auteur

J'ai mis echo 1 dans le 1if, echo 2 dans le elseif, echo 3 dans le 2eme if et echo 4 dans le 2eme elseif.
Lorsque je clique sur like, ça m'affiche : 1 c'est OK
sur dislike : 2 , alors que ça doit afficher 3 non ?
Ca ne m'affiche jamais 3 et 4

non car le statut est liker donc on ne peut pas le disliker en même temps.

Aranok
Auteur

Donc en fait, si on veut disliker un statut qu'on a liker, il faut d'abord reliker afin d'enlever son like et ensuite de disliker ?

oui, c'est comme cela que j'ai coder.
Après il suffit de tester quand on dislike un statut s'il est liker et à ce moment là, on le dé-like et inversement.

Sinon votre code fonctionne bien ? Aucun problème ?

Aranok
Auteur

Rien n'apparaît dans la bdd lorsque je like/dislike.

pas de message d'erreur ?
Donc il ne fait pas d'insert into.
que donne un print_r($like->errorInfo()); après l'execute ?

Aranok
Auteur

Aucun message d'erreur.
ça me donne ceci : Array ( [0] => 00000 [1] => [2] => )

Aranok
Auteur

je reçois les infos dans ma bdd mais vote vaut toujours 1

Donc la requête est bonne.
Si je modifie le 1er if pour le insert

$like = $dbh->prepare('INSERT INTO votes (vote,id_utilisateur,id_statut) VALUES (1,'.$getid.','.$id_statut.')');
$like->execute();

en

$sql = 'INSERT INTO votes (vote,id_utilisateur,id_statut) VALUES (1,'.$getid.','.$id_statut.')';
var_dump($sql);
$like = $dbh->prepare($sql);
$like->execute();
print_r($like->errorInfo());

Qu'est ce que cela affiche ?

Aranok
Auteur

Vote vaut toujours 1.
Que ça soit lorsque je clique sur like ou dislike, la même chose apparaît :
C:\wamp64\www\projetSite\TOUT\mur2.php:62:string 'INSERT INTO votes (vote,id_utilisateur,id_statut) VALUES (1,20,18)' (length=66)
Array ( [0] => 00000 [1] => [2] => )

et rien n'est insérer dans la bdd ?
oui regarder les liens dans le statut pour liker, ils sont identiques

Aranok
Auteur

Si ça s'insére bien dans la bdd, juste que la valeur vaut toujours 1

vous avez corriger le liens du dislike dans le formulaire ?

Aranok
Auteur

comme ceci ?

 <div class="vote_btns">
         <a class="vote_btn volte_like" href="<?= 'mur2.php?vote=like&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$affiche_statut['id_statut'];?>">
                    <i class="material-icons" >thumb_up</i> <?php echo $affiche_statut['like_count'];?>
        </a>
        <a class="vote_btn volte_dislike" href="<?= 'mur2.php?vote=dislike&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$affiche_statut['id_statut'];?>">
                    <i class="material-icons" >thumb_down</i> <?php echo $affiche_statut['dislike_count'];?>
          </a>
</div>

désormais ça vaut toujours 0

oui
coment ça, ça vaut toujours 0 ?

Aranok
Auteur

Je viens de supprimer tous les statuts afin de faire un test.
J'ai crée deux statuts, ce que je vais faire, c'est aimer le 1er statut, ensuite recliquer sur aimer pour le supprimer, cliquer sur dislike, et réappuyé sur dislike. Tout a l'air de fonctionner, regardez par vous mêmes :

Du coup je dois procéder de la même manière les 3 autres if/elseif ?
( $sql = 'INSERT INTO votes (vote,id_utilisateur,id_statut) VALUES (1,'.$getid.','.$id_statut.')';
$like = $dbh->prepare($sql);
$like->execute(); )
Désormais, la chose qui reste à faire, est d'assigner à like_count et a dislike_count le nombre de like/dislike.
J'avais fais ça, mais ça ne marche pas tout à fait :

    $pluslike = $dbh->prepare('UPDATE statut SET like_count = like_count + 1');
    $pluslike->execute();

Et pour enlever un like :

    $plusunlike = $dbh->prepare('UPDATE statut SET like_count = like_count - 1');
    $plusunlike->execute();

Mais ça infecte tous les statuts que l'utilisateur à mis ..

ok, je suis content que le système like/dislike fonctionne
vous pourrez l'améliorer de sorte que si je like un statut mais qu'il est déjà disliker alors ça enlèvera le dislike pour ajouter le like et inversement.

oui car on ne sais pas quel statut est affecté. Il manque un where.
par contre c'est compliqué ce que vous faite et ça oblige à faire des requête supplémentaire.

Je vous propose plutôt cette solution (rien n'est obligé)
On récupère tous les like de la table votes en fonction de l'id du statut

$dbh->prepare("SELECT COUNT(*) as like_count FROM votes WHERE vote = 1 AND id_statut = ?");

Vous voyez mon raisonnement ?

Aranok
Auteur

Votre 1er proposition est très interessante, ça serai ainsi plus facile de passer de like à dislike.

Pour la requête SQL, vous comptez le nombre de vote où vote = 1 par rapport à l'id du statut, c'est bien ça ? Du coup on fait la même chose pour vote = 0 c'est ça ? Et nous devons dans ce cas les mettres où précisemment ?

Oui c'est bien ça.
Je ne vais pas vous donner la réponse. ça serait trop facile.
Je vais vous donnez un indice.

Ces requêtes doivent être placer à un endroit du code où nous en avons besoin et où je peux avoir l'id du statut. Sans oublier que cette id statut à besoin de changer pour s'adapter au statut que je suis en train d'afficher.

Aranok
Auteur

J'ai essayé à divers endroit, mais selon moi, le mieux approprié serai de le mettre comme ceci :

                            <div class="vote">
                              <div class="vote_btns">
                                  <a class="vote_btn volte_like" href="<?= 'mur2.php?vote=like&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$affiche_statut['id_statut'];?>">
                                      <i class="material-icons" >thumb_up</i> <?php $abc = $affiche_statut['id_statut']; $dbh->prepare("SELECT COUNT(*) as like_count FROM votes WHERE vote = 1 AND id_statut = '.$abc.'");
                                      echo $affiche_statut['like_count'];?>
                                  </a>
                                  <a class="vote_btn volte_dislike" href="<?= 'mur2.php?vote=dislike&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$affiche_statut['id_statut'];?>">
                                      <i class="material-icons" >thumb_down</i> <?php $dbh->prepare("SELECT COUNT(*) as dislike_count FROM votes WHERE vote = 0 AND id_statut = '.$abc.'");
                                      echo $affiche_statut['dislike_count'];?>
                                  </a>
                              </div>
                            </div>

Mais ça ne marche pas :/

Ah non par pitié pas là. (^_^) Bon je vous l'accorde vous y êtes presque. Nous sommes d'accord qu'elle doit être mise dans cette boucle.
Par contre, on ne mets pas de requêtes au milieu d'un lien.
Voyez plutôt pour faire la requête après le déclaration de la boucle while.
Une fois fait, je vous montrerais comment optimiser ce code.

De plus je ne vous ai donné qu'une partie de ce qu'il y a à faire. Avez-vous oublier comment fait-on une requête pdo ?

Aranok
Auteur

Simplement un oublie ne vous en faites pas :D

<?php while($affiche_statut = $q->fetch()) { 
       $statut4 = $_GET['id_statut'];
       $compterlike = $dbh->prepare("SELECT COUNT(*) as like_count FROM votes WHERE vote = 1 AND id_statut = '.$statut4.'");
       $compterlike->execute();
        $compterdislike = $dbh->prepare("SELECT COUNT(*) as dislike_count FROM votes WHERE vote = 0 AND id_statut = '.$statut4.'");
        $compterdislike->execute();
?>

c'est déjà miuex.
A votre avis, est-il jucidieux de récupérer l'id du statut depuis un GET ?
Par contre, ma requête est mieux sinon avec la forme de la votre, le prépare est inutile.

Aranok
Auteur

Pour le GET, comme ceci ? :

$statut4 = $affiche_statut['id_statut'];

Pour la requête, je dois enléver le prepare ? Donc comme ceci :

$compterlike = ("SELECT COUNT(*) as like_count FROM votes WHERE vote = 1 AND id_statut = '.$statut4.'");
$compterlike->execute();
 $compterdislike = ("SELECT COUNT(*) as dislike_count FROM votes WHERE vote = 0 AND id_statut = '.$statut4.'");
$compterdislike->execute();

oui pour le get, non pour le prépare.
Laisser-tomber ce que j'ai dit. Vous comprendrez quand vous étudierez PDO plus en détails

Aranok
Auteur

Je laisse comme c'était avant du coup ?

$statut4 = $affiche_statut['id_statut'];
$compterlike =  dbh->("SELECT COUNT(*) as like_count FROM votes WHERE vote = 1 AND id_statut = '.$statut4.'");
$compterlike->execute();
 $compterdislike = dbh->("SELECT COUNT(*) as dislike_count FROM votes WHERE vote = 0 AND id_statut = '.$statut4.'");
$compterdislike->execute();

faut quand même mettre le prépare.
après un petit fetch.
Voyons voir si vous aller faire une erreur avec le résultat du fetch. (^_^)

Aranok
Auteur

Bon, votre dernière phrase ma faite un peu peur, je me suis dis que je vais faire un truc que je ne pensais pas faire, du coup j'ai fais ça : (je parie que vous allez rire car c'est n'importe quoi :D)

$statut4 = $affiche_statut['id_statut'];
$compterlike =  dbh->prepare("SELECT COUNT(*) as like_count FROM votes WHERE vote = 1 AND id_statut = '.$statut4.'");
$compterlike->execute();
$compterlike = $compterlike->fetch();
 $compterdislike = dbh->prepare("SELECT COUNT(*) as dislike_count FROM votes WHERE vote = 0 AND id_statut = '.$statut4.'");
$compterdislike->execute();
$compterdislike = $compterdislike->fetch();

Bon je ne vais rien dire, juste de ne pas oublier le $ devant dbh.
Pas d'erreur sur le fetch. Très bien.
Il reste juste à modifier en conséquence les variables dans liens pour afficher les votes.

Mette-moi ensuite le code complet de la boucle while et je vous explique l'optimisation dessus.

Aranok
Auteur

Quand vous parlez des liens, c'est bien ceci :

<a class="vote_btn volte_like" href="<?= 'mur2.php?vote=like&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$affiche_statut['id_statut'];?>">
        <i class="material-icons" >thumb_up</i> <?php echo $affiche_statut['like_count'];?>
 </a>

Et il faut changer le " $affiche_statut['like_count'] " par $compterdislike ... ou bien je dis des bêtises car je passe d'un array à un string ..

oui, il faut changer JUSTE le nom de la variable

Aranok
Auteur
<a class="vote_btn volte_like" href="<?= 'mur2.php?vote=like&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$affiche_statut['id_statut'];?>">
        <i class="material-icons" >thumb_up</i> <?php echo $compterlike['like_count'];?>
 </a>

oui c'est bon.
j'espère que ça affiche bien les count ?

Afficher moi la boucle while complète et je vais vous expliquez comment optimisez le codes des requêtes

Aranok
Auteur

Il y a juste un petit problème, imaginons j'aime mon 1er statut, j'aime aussi le 2eme statut, et que sur le 1er statut j'appuie sur j'aime pour annuler le like, et bien voici ce qui s'affiche : http://puu.sh/oFmcl/04673a40a3.png et dés que je réappuie sur dislike ou like du 1er statut, le count du 2eme statut reviens : http://puu.sh/oFmec/2cddf86b18.png
La boucle while :

 <?php while($affiche_statut = $q->fetch()) { 
                      $statut4 = $affiche_statut['id_statut'];

                      $compterlike = $dbh->prepare("SELECT COUNT(*) as like_count FROM votes WHERE vote = 1 AND id_statut = '.$statut4.'");
                      $compterlike->execute();
                      $compterlike = $compterlike->fetch();

                      $compterdislike = $dbh->prepare("SELECT COUNT(*) as dislike_count FROM votes WHERE vote = 0 AND id_statut = '.$statut4.'");
                      $compterdislike->execute();
                      $compterdislike = $compterdislike->fetch();
                    ?>

Si vous pouvez m'expliquer vote idée cité au dessusn je vous cites : " vous pourrez l'améliorer de sorte que si je like un statut mais qu'il est déjà disliker alors ça enlèvera le dislike pour ajouter le like et inversement. "

La je ne comprends pour ça se passe comme cela.
Avec le système d'echo qu'on a tester tout à l'heure, qu'est ce qu'il affiche. (echo 1 dans le 1er if...)

Mon dée est la suivante.
Quand on like un statut, il faut tester s'il existe un dislike. Si oui, on enlève le dislike et on ajoute un like.

Aranok
Auteur

Même après avoir effacer tout mes statut, et que je rafraichis la page, le vote est toujours là (le 1 est toujours afficher en haut)
J'ai fais une video youtube du problème : https://youtu.be/lQyCfvPKT_8 (je vais me coucher, je serai dispo dés demain en fin de mâtiné ^^, bonne nuit à vous)

Aranok
Auteur

Bonjour,
J'ai refais une vidéo expliquant un problème que j'ai remarqué, je ne sais pas si vous l'avez chez vous (j'ai bien repris votre code) :
https://www.youtube.com/watch?v=FfhKmpJq9kA

Bonjour, je vais juste jeter un coup d'oeil que votre code complet soit bon.

Aranok
Auteur

J'ai mis la 1er requête au dessus du while, je ne sais pas si ça change quelque chose :

<?php

session_start();

$bdd = 'mysql:host=localhost;dbname=sitesocialnetwork';
$user = 'root';
$password2 = '';
try{
  $dbh = new PDO($bdd, $user,$password2, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} 
catch (PDOException $e) {
    echo 'Echec de la connexion : ' . $e->getMessage();
    exit;
}

if(isset($_GET['id_utilisateur']) AND $_GET['id_utilisateur'] > 0)
{
    $getid = intval($_GET['id_utilisateur']); // sécuriser la valeur en nombre
    $requser = $dbh->prepare('SELECT * FROM utilisateurs WHERE id_utilisateur = ?');
    $requser->execute(array($getid));

    $userinfo = $requser->fetch();
    $q = $dbh->prepare('SELECT id_statut,description, date_statut,like_count,dislike_count FROM statut WHERE id_utilisateur = '.$getid.' ORDER BY date_statut DESC');
    $q->execute();

  //Mettre un nouveau statut

  if(isset($_POST['action'])) // On récupére le statut dans la bdd
  {
    if($_POST['action'])
    {
      if(!empty($_POST['content']))
      {
        $id_statut=$_SESSION['id_utilisateur'];
        $content=htmlspecialchars($_POST['content']);
        $db = $dbh->prepare('INSERT INTO statut(description, id_utilisateur, date_statut) VALUES ("'.$content.'", "'.$getid.'", NOW())');
        $db->execute();
        $erreur = "Votre statut a été mis à jour !";
      }

    }
  }

  // php du like 

  if(isset($_GET['id_statut']))
  {
    $id_statut = $_GET['id_statut'];
    $req2 = $dbh->prepare('SELECT vote FROM votes WHERE id_utilisateur = ? AND id_statut = ?');
    $req2->execute(array($getid,$id_statut));
    $vote = $req2->fetch();

    // 1 pour like et 0 pour dislike

    // Si le mode de vote est "like" et qu'aucun vote n'est renseigné
    // Alors on met "like"
    if(isset($_GET['vote']) && $_GET['vote'] == 'like' && empty($vote))
    {
      $sql = 'INSERT INTO votes (vote,id_utilisateur,id_statut) VALUES (1,'.$getid.','.$id_statut.')';
      $like = $dbh->prepare($sql);
      $like->execute();
      echo "1";

    }
    // Si le mode de vote est "like" et que le vote vaut 1
    // Alors on enlève le "like"
    elseif (isset($_GET['vote']) && $_GET['vote'] == 'like' && $vote['vote'] == 1)
    {
      $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = 1 AND id_utilisateur = :getid AND id_statut = :id_statut');
      $unlike->execute(array(':getid' => $getid,':id_statut' => $id_statut));
      echo "2";
    }

    // Si le mode de vote est "dislike" et qu'aucun vote n'est renseigné
    // Alors on met "dislike"
    elseif(isset($_GET['vote']) && $_GET['vote'] == 'dislike' && empty($vote))
    {
      $like = $dbh->prepare('INSERT INTO votes(vote,id_utilisateur,id_statut) VALUES (0,"'.$getid.'","'.$id_statut.'")');
      $like->execute();
    echo "3";
    }
    // Si le mode de vote est "dislike" et que le vote vaut 1
    // Alors on enlève le "dislike"
    elseif (isset($_GET['vote']) && $_GET['vote'] == 'dislike' && $vote['vote'] == 0)
    {
      $unlike = $dbh->prepare('DELETE FROM votes WHERE vote = 0 AND id_utilisateur = :getid AND id_statut = :id_statut');
      $unlike->execute(array(':getid' => $getid,':id_statut' => $id_statut));
    echo "4";

  }

  }

?>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Profil de <?php  echo $userinfo['nom']; 
                            echo " ";
                            echo $userinfo['prenom']; ?></title>
    <link href="materialize.css" rel="stylesheet" media="all" type="text/css"> 
    <link href="footer.css" rel="stylesheet" media="all" type="text/css">
    <link href="like.css" rel="stylesheet" media="all" type="text/css">
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

  </head>
  <body>
    <main>
      <nav class ="blue darken-2">
        <div class=" nav-wrapper container">
          <a href="#!" class="brand-logo">TSN </a>

          <ul class="right">                    
            <li><a href="acceuil.php">Acceuil</a></li>
            <li><a href="<?php echo 'profil2.php?id_utilisateur='.$userinfo['id_utilisateur'];?>">Profile</a></li>
            <li><a href="choixMessage.php">Messages</a></li>
            <li><a href="deconnexion.php">Deconnexion</a></li>
          </ul>

        </div>
      </nav>

      <div id="profil">  
        <h4 align="center"> Profil de <?php  echo $userinfo['nom']; 
                              echo " ";
                              echo $userinfo['prenom']; ?> </h4><br>

        <center>                      
          <a class="waves-effect waves-light btn" href="<?php echo 'mur.php?id_utilisateur='.$getid.'';?>">Mur</a>
          <a class="waves-effect waves-light btn" href="<?php echo 'infoprofil.php?id_utilisateur='.$getid.'';?>">Informations</a>
          <a class="waves-effect waves-light btn" href="">Photos</a>
          <a class="waves-effect waves-light btn" href="">Amis</a>
                <?php 
                  if(isset($_SESSION['id_utilisateur']) AND $userinfo['id_utilisateur'] == $_SESSION['id_utilisateur'])
                  {
                  ?>
                    <a class="waves-effect waves-light btn" href="editionprofil.php">Editer mon profil</a>
                <?php
                }
                ?>
        </center><br><br>
        <div class="container">
          <div class="row">                        
            <div class="col s12 m4 l4"><p>
                  <?php 
                    if(!empty($userinfo['photo_profil']))
                    {
                  ?>
                  <img src="membre/photoProfil/<?php echo $userinfo['photo_profil']; ?>" class="materialboxed" width="200">
                  <?php
                    }
                  ?> <br>

              <div class="input-field col s12 m4 l4">
                <label for="newtel">Date d'inscription'</label>
                <input disabled value="<?php echo $userinfo['date_inscription'];?>" id="disabled" type="text" class="validate">
              </div>
            </div>

                      <!-- Envoyer un statut -->

              <div class="col s12 m4 l5"><p>
                <?php if(isset($_SESSION['id_utilisateur']) AND $userinfo['id_utilisateur'] == $_SESSION['id_utilisateur']){ ?>
                  <div class="row">
                    <form class="col s12" action="" method="post">
                      <div class="row">
                        <div class="input-field col s12">
                          <textarea name="content" class="materialize-textarea"></textarea>
                          <label for="textarea1">Statut</label>
                        </div>
                      </div>

                      <!-- -->
                      <!-- Envoyer une photo en statut 
                      <?php  ?>
                      <form action="#">
                        <div class="file-field input-field">
                          <div class="btn">
                            <span>Photo</span>
                            <input type="file" name="photo">
                          </div>
                          <div class="file-path-wrapper">
                            <input class="file-path validate" type="text">
                          </div>
                        </div>
                      </form> -->

                      <!--  -->

                    <button class="btn waves-effect waves-light" type="submit" name="action" value="Envoyer">
                      <i class="material-icons center">Envoyer</i>
                    </button>
                    </form>
                  </div>
                  <div class="row">
                    <?php $count = $dbh->prepare("SELECT * FROM votes WHERE vote = :vote AND id_statut = :statut");
                    ?>
                    <?php while($result = $q->fetch()) : ?>
                      <?php
                      $statut4 = $result['id_statut'];
                        // Count des likes
                      $count->execute(array(':vote' => '1', ':statut' => $statut4));
                      $compterlike = $count->rowCount();

                        // Cout des dislike
                      $count->execute(array(':vote' => '0', ':statut' => $statut4));
                      $compterdislike = $count->rowCount();
                      ?>
                      <div class="col s12 m12">
                        <div class="card blue-grey darken-1">
                          <div class="card-content white-text">
                            <span class="card-title"> <?php   echo $userinfo['nom'];
                                                                 echo " ";
                                                                 echo $userinfo['prenom']?> </span>

                            <p> <?= $result['description']; ?> </p>

                          </div>
                          <div class="card-action">
                            <a href="<?php echo 'commenter.php?id_statut='.$idS;?>">Commenter</a>
                            <div class="vote">
                              <div class="vote_btns">
                                  <a class="vote_btn volte_like" href="<?= 'mur2.php?vote=like&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$result['id_statut'];?>">
                                      <i class="material-icons" >thumb_up</i> <?php echo $compterlike;?>
                                  </a>
                                  <a class="vote_btn volte_dislike" href="<?= 'mur.php?vote=dislike&id_utilisateur='.$userinfo['id_utilisateur'].'&id_statut='.$result['id_statut'];?>">
                                      <i class="material-icons" >thumb_down</i> <?php echo $compterdislike;?>
                                  </a>
                              </div>
                            </div>
                          </div>
                        </div>
                      </div>
                    <?php endwhile; ?>                     
                  </div>
                <?php } ?>
              </div>
          </div>
        </div>
      </div>
      <center>
        <?php
        if(isset($erreur))
        {
          echo '<font color="red">'.$erreur."</font>";
        }
      ?>
      </center>
      <br>
    </main>     
    <footer class ="page-footer blue darken-2">
      <div class="footer-copyright">
        Copyright &copy; 2016 the | All rights reserved
      </div>
    </footer>

    <!-- SCRIPT -->

    <script src="js/jquery.timeago.js"></script>
    <script src="js/jquery.timeago.fr.js"></script>
    <script src="js/jquery.livequery.min.js"></script>
    <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script src="js/materialize.js"></script>
    <script src="js/init.js"></script>
    <script type="text/javascript">
      window.ParleyValidator.setLocale('fr');
      $(document).ready(function) {
        $("span.timeago").timeago();
      });
    </script>
  </body>
</html>
<?php
}
?>

Oui c'est le but des requête préparé. Cela évite de préparer X fois la même requête.
Pour le dislike, vous appelez "mur.php", est-ce normale ?

Voici mon skype : djcarouge10
Cela me permettra de faire un teamviewer