Bonjour.
Voilà alors, je suis en ce moment entrain de me pencher sérieusement au php, pour des futurs projets, et j'ai mis en place un système de "like/dislikes" sur les articles de mon blog.
Tout fonctionne correctement, les personnes peuvent mettre un like sur l'articles qu'ils veulent, et cela sera ensuite enregistré dans ma base de donnée. L'@IP de l'utilisateur est également stocké dans la bdd.
J'aimerais que chaque @IP puisse liker ou disliker un article UNE SEULE FOIS.
Voici mes codes (de likes/dislikes) :
Fichier (more.php) - Je vous met seulement les codes utiles aux likes/dislikes.
<?php
include('config.php');
if($article->rowCount() == 1) {
$article = $article->fetch();
$id = $article['id'];
$likes = $connect2->prepare('SELECT id FROM likes WHERE id_article = ?');
$likes->execute(array($id));
$likes = $likes->rowCount();
$dislikes = $connect2->prepare('SELECT id FROM dislikes WHERE id_article = ?');
$dislikes->execute(array($id));
$dislikes = $dislikes->rowCount();
}
<a href="action.php?action=1&id=<?php echo $id; ?>">
<img src="wp-content/uploads/2017/07/pouce_vert.jpg" title="J'aime" style="height:45px;margin:15px;" /></a>
<a href="action.php?action=2&id=<?php echo $id; ?>">
<img src="wp-content/uploads/2017/07/pouce_rouge.jpg" title="J'aime pas" style="height:45px;margin:15px;" /></a>
<br />
<div style="margin-left:32px;display: inline-block;color:green;"><?php echo $likes; ?></div>
<div style="margin-left:65px;display: inline-block;color:red;"><?php echo $dislikes; ?></div>
Fichier (action.php)
<?php
include('config.php');
if(isset($_GET['action'], $_GET['id']) AND !empty($_GET['action']) AND !empty($_GET['id'])){
$get_action = (int) $_GET['action'];
$getid = (int) $_GET['id'];
$ipA = $_SERVER['REMOTE_ADDR'];
$check = $connect2->prepare("SELECT id FROM articles WHERE id = ?");
$check->execute(array($getid));
if($check->rowCount() == 1) {
if($get_action == 2) {
$ins = $connect2->prepare("INSERT INTO dislikes (id_article, ip_address) VALUES (?, ?)");
$ins->execute(array($getid, $ipA));
} elseif ($get_action == 1) {
$ins2 = $connect2->prepare("INSERT INTO likes (id_article, ip_address) VALUES (?, ?)");
$ins2->execute(array($getid, $ipA));
}
header('Location: ./more.php?id='.$getid);
} else {
exit("Erreur fatale. <a href=\"http://blog.webstorming.eu/index.php\">Retournez sur le site</a>");
}
} else {
exit("Erreur fatale. <a href=\"http://blog.webstorming.eu/index.php\">Retournez sur le site</a>");
}
?>
J'espère que vous saurez m'aider :)
Cordialement, DayTech :)
Bonjour,
Avant de like / dislike un article, il vous savoir si l'utilisateur l'a déjà fait. Donc pour cela, il faut vérifier si son adresse IP pour cette article existe déjà.
Par contre, avec votre code, on a la possibilité de mettre un J'aime ET un J'aime pas sur le même article ? Cela n'est pas cohérent.
Ok pour vérifier s'il existe déjà, mais comment faire ? Je me suis renseigner, il me semble que la commande SQL "EXISTS" pourrait m'aider à résoudre mon problème ? Je ne suis pas sûr.
Et pour la possibilité de mettre un like/dislike sur le même article, c'est justement ce que je veux faire : si l'@ip est déjà présente dans la bdd, interdire le fait qu'il like / dislike une nouvelle fois.
Bonjour,
Pas forcément la meilleurs solution.. mais elle a le mérite de fonctionner..
Tu créer une table "Likes" (ou likes_dislikes si tu préfères..), :
id - (les trucs basiques... INT auto incrémente, primary)
likes INT (Compteur de like pour chaque article qui serait un booléan avec 0 comme valeur par défaut).
dislikes INT (compteur de dislike qui serait lui aussi un booléan avec 0 comme valeur par défaut).
article_id : INT (ou var_char) l'id de l'article liké (ou disliké)
VotedBy : Var_char L'IP (ou le pseudo) de l'user qui a liké ou disliké
Quelques explications :
Tu ajoutes en base chaque like ou dislike (l'utilité du booléan : Si l'user a aimé l'article likes vaudra 1 (et donc dislikes vaudra toujours 0) et inversément :D Ce n'est pas forcément obligatoire (vu que tu as déjà sans doute un compteur de like dislike, donc tu pourrais juste créer un champ "Voted" qui vaudrait soit 1 ou 0 si c'est vrai ou faux) et "Vote_by" pour savoir qui a voté).
Tu ajoutes ensuite l'IP ou le pseudo de l'user (ça c'est pour après, pour comparer)
et l'id de l'article te permettera par exemple de pouvoir récupérer les likes et dislikes de chaque article (par exemple).. surtout de savoir de quel article on parle (pour bien bloquer le vote sur le bon article).
Ensuite dans ton code tu fais une comparaisons :
Si username (ou l'IP) se trouve dans la table likes / dislikes (ça veut dire qu'il a liké après justement tu peux savoir si il a liké ou disliké grâce au compteur).
Perso, je ferais différement pour éviter le soucis.
Je crée un table like avec un id, id_article, like, ip_user
Quand je clique sur like alors je vais vérifier dans la table like si j'ai un like ou un dislike ou rien. Et suivant la réponse, je fais un traitement différent.
Si on regarde votre code (afin de continuer sur celui-ci), un simple "SELECT ip_address FROM like WHERE id_article = ?", puis un rowcount sur le résultat, permettra de savoir s'il y a une ip de renseigner ou non
Et la même chose sur dislike.