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
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.
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 ?
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.
ç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.
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
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 ?
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"
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 ?
<?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 ?
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
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 ^^
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');
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 ?
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 ?
Je ne pense pas que ça soit aussi simple que ça ?
<input type="hidden" name="id_statut" value="id_statut">
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 ?
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 ^^
<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.
Vous avez bien raison, je vais réessayer demain vers les coups de midi ! Bonne nuit à vous !
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?
<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
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
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é
$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 ?
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 ?
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
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
while($value = $req2->fetchAll(PDO::FETCH_BOTH))
{
$tab[] = $value;
}
Il faut ajouter quelque chose dans les crochets de tab je suppose ?
$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
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 ?
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.
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 ?
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.
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));
}
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
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.
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 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 ?
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>';
}
?>
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 ?
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 ?
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
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
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
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)
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));
$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.
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 ^^
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 © 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
}
?>
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 © 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)
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 © 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
}
?>
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.
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']
Effectivement, c'est bien ça. Lorsque j'appuie sur like/dislike, cette erreur apparaît : http://puu.sh/oF3np/37bc88ac4e.png
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
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
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
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 ?
pas de message d'erreur ?
Donc il ne fait pas d'insert into.
que donne un print_r($like->errorInfo()); après l'execute ?
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 ?
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
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
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 ?
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.
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 ?
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.
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
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. (^_^)
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.
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 ..
<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
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.
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)
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
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 © 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