[RESOLU] Limiter 1 like par membre

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Limiter 1 like par membre

Re: Limiter 1 like par membre

par Larker » 19 oct. 2014, 15:08

C'est bon ça fonctionne, un big merci Xtg. :D

Re: Limiter 1 like par membre

par xTG » 19 oct. 2014, 14:12

$posteur = $bdd->quote($_SESSION['id']);
$id_news = $bdd->quote($_GET['id']);
$getNewsQuery = $bdd->query("SELECT * FROM `like_news` WHERE posteur='$posteur' AND id_news='$id_news'");
if( $getNewsQuery->fetch() !== false )
{  
   // Le visiteur a déjà voté car on a trouvé un enregistrement
 }
else
{
   echo '<form method="post" action="">
               <button name="envoie_like">Like</button>
            </form>';
}

Re: Limiter 1 like par membre

par Larker » 19 oct. 2014, 10:27

D'accord donc en gros en fonction de la news courante, il faudra un Get['id'] je suppose.
Et concernant le posteur il doit donc être égale à la session du joueur ?

Donc ça donne ça :
$getNewsQuery = $bdd->query("SELECT * FROM `like_news` WHERE posteur='$posteur' AND id_news='$id_news'");
if($getNews = $getNewsQuery->fetch())
{     
if ($posteur == $_SESSION['id'] && $id_news == $_GET['id'])
{
    echo '';
}
else // SINON
{
    echo '<form method="post" action="">
            <button name="envoie_like">Like</button>
</form>';}
 }

Re: Limiter 1 like par membre

par xTG » 19 oct. 2014, 10:25

Non, que tu ais ce qu'il faut dans ces variables.
$id_news doit être égal à l'id de la news courante.
$posteur doit $etre égal à l'id membre actif.

Re: Limiter 1 like par membre

par Larker » 18 oct. 2014, 21:19

C'est à dire, il faut que je supprime ma condition ?

Re: Limiter 1 like par membre

par xTG » 18 oct. 2014, 21:04

Si $posteur et $id_news ont la bonne valeur alors tu as tout.

Re: Limiter 1 like par membre

par Larker » 18 oct. 2014, 20:03

Salut Xtg,

Merci de ton aide en tout cas. :)

Donc du coup j'arrive à ça pour le moment :
$getNewsQuery = $bdd->query("SELECT * FROM `like_news` WHERE posteur=$posteur AND id_news=$id_news");
if($getNews = $getNewsQuery->fetch())
{      
if ($getNews['like_news'] == "1")
{
    echo '';
}
else // SINON
{
    echo '<form method="post" action="">
            <button name="envoie_like">Like</button>
</form>';}
 } 
Du coup, je vois pas trop quoi modifier à part ça maintenant ?

Re: Limiter 1 like par membre

par xTG » 18 oct. 2014, 17:37

Le principe est bon, c'est un bon début. :)

Tu peux remplacer le while par un if car la requête ne pourra retourner qu'un seul résultat maximum.
Enfin le or die[...] est inutile car tu n'utilises pas le driver MySQL mais la bibliothèque PDO.
Pour gérer les erreurs avec PDO : http://fr2.php.net/manual/fr/pdo.error-handling.php

Maintenant il faut transmettre les bonnes valeurs à la clause WHERE de la requête.
Déjà parlons protection de variable pour éviter les injections SQL.
Tu peux avec PDO utiliser des requêtes préparées (mais un peu inutile dans ton cas d'exécution) ou bien utiliser la fonction quote().
Si l'on souhaite protéger la variable $input on ferra donc :
$input = $bdd->quote($input);
Avant de l'utiliser dans une requête SQL.

Enfin pour ton cas la clause WHERE devrait plutôt être :
$getNewsQuery = $bdd->query("SELECT * FROM `like_news` WHERE id_membre=$id_membre AND id_news=$id_news");
Sachant qu'il faut que $id_membre et $id_news contiennent les bonnes valeurs.

Re: Limiter 1 like par membre

par Larker » 18 oct. 2014, 12:01

ça donnerais quelque chose comme ça :
$getNewsQuery = $bdd->query("SELECT * FROM `like_news` WHERE posteur=id_news") or die(mysql_error());
while($getNews = $getNewsQuery->fetch())
{	

if ($getNews['like_news'] == "1")
{
    echo '';
}
else // SINON
{
    echo '<form method="post" action="">
            <button name="envoie_like">Like</button>
</form>';}
							


 } 
J'ai essayé ça mais ça n'a pas l'air de fonctionner. :/
En gros j'ai voulu afficher le bouton au membre qui n'a pas encore mis un j'aime et s'il a déjà "liké" alors le bouton sera masqué.

Re: Limiter 1 like par membre

par xTG » 18 oct. 2014, 07:20

Il te faut faire une requête de sélection avec une clause where.
Si tu ne sais pas t'orienter à partir de cela je te recommande le cours suivant :
http://www.phpdebutant.org/article66.php
;)

Il utilise le driver Mysql qui est non recommandé (le cours date un peu), il te suffit ensuite d'aller lire la documentation de PDO pour l'adapter.

Re: Limiter 1 like par membre

par Larker » 17 oct. 2014, 20:21

Oui mais je ne vois pas trop comment faire en fait. :?

Re: Limiter 1 like par membre

par xTG » 17 oct. 2014, 20:18

Tu regardes s'il n'existe pas déjà un enregistrement pour l'id_news et l'id_membre en question ?

Limiter 1 like par membre

par Larker » 17 oct. 2014, 20:13

Bonjour à tous,

Je rencontre actuellement un problème : je dispose d'une table like pour mon module news et je souhaiterais qu'il ne soit possible d'envoyer qu'un seul like par membre donc par session.

Sauf que je ne sais pas du tout comment faire.

Voici ma table like_news :

CREATE TABLE IF NOT EXISTS `like_news` (
`id` int(11) NOT NULL,
`id_news` bigint(20) NOT NULL,
`id_membre` bigint(20) NOT NULL,
`like_news` int(11) NOT NULL,
`date` date NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

Voici mon code :
if(isset($_POST['envoie_like'])){
                $posteur = $_SESSION['id'];
                $id_news = $_GET['id'];
                $date = date('Y-m-d');
                $addNewsQuery = $bdd->prepare("INSERT INTO `like_news` VALUES ('', ?, ?, ?, ?)") or die(mysql_error());
                $addNewsQuery->execute(array($id_news, $posteur, '1', $date)) or die(mysql_error());
    echo 'Envoie effectué!';           
    }
Merci d'avance à ceux qui pourront m'aider. ;)