[RESOLU] Limiter 1 like par membre

Eléphant du PHP | 283 Messages

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

ViPHP
xTG
ViPHP | 7331 Messages

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 ?

Eléphant du PHP | 283 Messages

17 oct. 2014, 20:21

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

ViPHP
xTG
ViPHP | 7331 Messages

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.

Eléphant du PHP | 283 Messages

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é.

ViPHP
xTG
ViPHP | 7331 Messages

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.

Eléphant du PHP | 283 Messages

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 ?

ViPHP
xTG
ViPHP | 7331 Messages

18 oct. 2014, 21:04

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

Eléphant du PHP | 283 Messages

18 oct. 2014, 21:19

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

ViPHP
xTG
ViPHP | 7331 Messages

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.

Eléphant du PHP | 283 Messages

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>';}
 }

ViPHP
xTG
ViPHP | 7331 Messages

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>';
}

Eléphant du PHP | 283 Messages

19 oct. 2014, 15:08

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