Hey !

Je rencontre un leger souci (je pense) avec mon code,
Mon premier souci étant résolu je me permet de recréer un nouveau topic afin de clarifier mon nouveau souci :

Je souhaiterai pouvoir passer un esle dans ma condition mais j'ai l'impression que malgrès toutes mes tentatives mon code se fait la mal et boycotte totalement mon else...
Donc je ne sait pas d'ou vient le problème...
La variable $votes est elle bien interceptée ?

Voici mon code avec ma variable $votes qui s'occupe de recuperer l'id_membre (s'il y'en à un) :

<?php
require 'inc/config.php';
//On verifie que lidentifiant de lutilisateur est defini
if(isset($_GET['id']))
{
  $id = intval($_GET['id']);
  //On verifie que lutilisateur existe
  $dnui = mysql_query('select * from sn_votes where id_membre="'.$id.'"');
  if(mysql_num_rows($dnui)>0)
  {
    $votes = mysql_fetch_array($dnui);
    //On affiche les donnees de lutilisateur
  }
}
?>

Ensuite j'aimerais que si, un id_membre correspondant à l'id de la session active c'est à dire $_SESSION['auth']->id et trouvée, alors il executera cette condition :

{
   require_once 'inc/db.php';
      $id = $dnn['id'];
        $req = $pdo->prepare("UPDATE users_snapub SET like_count = like_count+1 WHERE id = ?");
        $req->execute([$id]);

        $req3 = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
        $req3->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));
        setcookie('2758257275365453_'.$id, 'true', time()+24000000);
        header("Location: $_SERVER[HTTP_REFERER]");
        exit();
}

Et si, aucun id_membre n'est trouvée alors il executera cette condition :

{
   require_once 'inc/db.php';
      $id = $dnn['id'];
        $req = $pdo->prepare("UPDATE users_snapub SET like_count = like_count+1 WHERE id = ?");
        $req->execute([$id]);

        $req2 = $pdo->prepare("INSERT INTO sn_users_badges SET user_id = ?, badge_id = '2', desc_badge = 'Un badge', date_attribution = NOW()");
        $req2->execute(array($_GET['id_membre']));

        $req3 = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
        $req3->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));
        setcookie('2758257275365452_'.$id, 'true', time()+24000000);
        header("Location: $_SERVER[HTTP_REFERER]");
        exit();
}

En gros, si il trouve un id_membre alors il execute la requete d'ajout de votes normalement,
Et si il ne trouve aucun id_membre alors il executera la requête standard d'ajout de vote ainsi que celle de deverouillage du badge !

Voila, j'espère que vous aurrez comprit mon cas et que vous serrez pas trop ennouyer à l'idée de lire toutes mes explications,
Voici mon code au complet et à l'original :

<?php
require 'inc/config.php';
//On verifie que lidentifiant de lutilisateur est defini
if(isset($_GET['id']))
{
  $id = intval($_GET['id']);
  //On verifie que lutilisateur existe
  $dnui = mysql_query('select * from sn_votes where id_membre="'.$id.'"');
  if(mysql_num_rows($dnui)>0)
  {
    $votes = mysql_fetch_array($dnui);
    //On affiche les donnees de lutilisateur
  }
}
?>
<?php
if (!empty($votes['id_membre']) && $_GET['snoop'] === "1") // note : j'ai modifié un peu cette ligne, elle était légèrement mal construite.
{
   require_once 'inc/db.php';
      $id = $dnn['id'];
        $req = $pdo->prepare("UPDATE users_snapub SET like_count = like_count+1 WHERE id = ?");
        $req->execute([$id]);

        $req2 = $pdo->prepare("INSERT INTO sn_users_badges SET user_id = ?, badge_id = '2', desc_badge = 'Un badge', date_attribution = NOW()");
        $req2->execute(array($_GET['id_membre']));

        $req3 = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
        $req3->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));
        header("Location: $_SERVER[HTTP_REFERER]");
        exit();
} else if ($_GET['snoop'] === "1") // note : j'ai modifié un peu cette ligne, elle était légèrement mal construite. 
{
   require_once 'inc/db.php';
      $id = $dnn['id'];
        $req = $pdo->prepare("UPDATE users_snapub SET like_count = like_count+1 WHERE id = ?");
        $req->execute([$id]);

        $req3 = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
        $req3->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));
        setcookie('2758257275365453_'.$id, 'true', time()+24000000);
        header("Location: $_SERVER[HTTP_REFERER]");
        exit();
}
?>

A bientôt !

9 réponses


SLK
Réponse acceptée

Salut,

La variable $votes est elle bien interceptée ?

Je n'ai pas compris la question.

À la place de
if (!empty($votes['id_membre']) && $_GET['snoop'] === "1")
il faudrait mettre
if ($dnui != false && $_GET['snoop'] === "1")

Mais $dnui tu l'a récupéré avec mysql_query, alors que c'est une fonction obsolète.
http://php.net/manual/fr/function.mysql-query.php
tu as utilisé PDO pour le reste, utilise-le ici aussi.

Et ya du code qui se mélange dans tes conditions, essaie de factoriser un peu.

Là on a :

si A et B
{
    req1
    req3
    cookie
    redirection
}
sinon, si B
{
    req1
    req2
    req3
    cookie
    redirection
}

et, "si A et B, sinon, si B",
ça peut se remplacer par : "si (non A) et B".
donc :

on peut remplacer par :

si B
{
    req1
    si non A
    {
        req2
    }
    req3
    cookie
    redirection
}

donc :

if ($_GET['snoop'] === "1")
{
    require_once 'inc/db.php';
    $id = $dnn['id'];

    $req = $pdo->prepare("UPDATE users_snapub SET like_count = like_count+1 WHERE id = ?");
    $req->execute([$id]);

    if ($dnui != false)
    {
        $req2 = $pdo->prepare("INSERT INTO sn_users_badges SET user_id = ?, badge_id = '2', desc_badge = 'Un badge', date_attribution = NOW()");
        $req2->execute(array($_GET['id_membre']));
    }

    $req3 = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
    $req3->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));

    setcookie('2758257275365453_'.$id, 'true', time()+24000000);
    header("Location: $_SERVER[HTTP_REFERER]");
    exit();
}

tu as laissé mon commentaire, qui vient de ton sujet précédent :
// note : j'ai modifié un peu cette ligne, elle était légèrement mal construite.
enlève-le maintenant,
surtout que je n'ai écris que le 1er,
le 2ème doit venir d'un copié/collé, et n'a pas de sens ici.

Aussi,
au début, tu as mis la "req2" dans le 2ème if,
mais quand tu récapitule il est dans le 1er,
c'est pas clair.
(j'ai cru comprendre qu'il fallait le mettre dans le 2ème)

Whaaaaaa je suis vraiment, mais vraiment reconnaissant envers toi LSK,
ton code fonctionne parfaitement,
tu a résolu mon problème et tu à tout à fait comprit ce que je voulais, donc merci, vraiment merci !!

Je comptais refaire le code de A à Z après avoir vue ton schema et 5min plus tard j'ai descendu la page en voyant qu'à la final... Tu avais l'avais déjà fait... Donc franchement merci !

A bientôt !

Finalement SLK je vient de trouver un problème encore...

Il s'avère que peut importe si l'utilisateur à déjà debloquer ce succès alors la req2 est comme même executée...
Ce qui fait que l'utilisateur peut debloquer plusieur fois le même succès...
En gros la condition :

if ($dnui != false)

Ne fonctionne pas...

Je relis ton post, et je me rend compte que la req2, c'est pour attribuer un badge, quand on débloque UN succès particulier.
UN succès correspond à UN badge, c'est ça ?

Déjà, ça aurait été plus logique d'écrire :

if ($dnui == false) // au lieu de !=

Oui, si on l'a pas trouvé, alors on l'ajoute.

Mais de toutes façons, on dirait que c'est la requête SQL qui n'est pas bonne.

Là on cherche juste si dans la table "sn_votes" on trouve une ou plusieurs lignes correspondant à un utilisateur en particulier.
Alors qu'il faudrait rajouter une condition en plus :
Il faut trouver les lignes qui correspondent à cet utilisateur, mais aussi qui correspondent en même temps au badge/succès recherché.

Il faut donc rajouter une clause AND dans la reqête SQL.
(AND le badge est celui qu'on recherche)

Essaie de mettre le nouveau code à jour pour qu'on travail sur la même chose.
Par exemple cet ancien code...

$dnui = mysql_query('select * from sn_votes where id_membre="'.$id.'"');
if(mysql_num_rows($dnui)>0)
{
    $votes = mysql_fetch_array($dnui);
    //On affiche les donnees de lutilisateur
}

...tu l'as remplacé par quoi ?

Et la nouvelle requête SQL aussi,
et tout ce que tu as modifié quoi.

Sa te dirais de venir sur Skype SLK ?

Le code complet :

<?php
require 'inc/config.php';
//On verifie que lidentifiant de lutilisateur est defini
if(isset($_GET['id']))
{
  $id = intval($_GET['id']);
  //On verifie que lutilisateur existe
  $dnui = mysql_query('SELECT * FROM sn_votes WHERE id_membre="'.$id.'"');
  $votes = mysql_fetch_array($dnui);
}
?>
<?php
if ($_GET['snoop'] === "1")
{
   require_once 'inc/db.php';
    $id = $dnn['id'];

    $req = $pdo->prepare("UPDATE users_snapub SET like_count = like_count+1 WHERE id = ?");
    $req->execute([$id]);

    if ($dnui == false)
    {
       $req2 = $pdo->prepare("INSERT INTO sn_users_badges SET user_id = ?, badge_id = '9', desc_badge = 'Voter pour la première fois', date_attribution = NOW()");
        $req2->execute(array($_GET['id_membre']));
    }

    $req3 = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
    $req3->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));

    setcookie('2758257275365453_'.$id, 'true', time()+24000000);
    header("Location: $_SERVER[HTTP_REFERER]");
    exit();
}
?>

A savoir que l'utilisation du cookie à la fin du code est l'une des failles de mon site, je m'explique,
Le cookie fonctionne afin que, à chaque vote il enregistre un cookie avec l'id du membre qui à été votée et si le cooki est reperée alors l'utilisateur ne pourra pas revoter une seconde fois,
Si il supprime le cookie et raffraichit sa page, alors il pourra re voter pour la même personne,
Je prevoit d'enlever cette verification, trop inutile selon moi car elle est trop facilement contournable par la verification dans la table sn_votes, qui elle enregistre tout les faits et gestes des membres au niveaux des votes

ben... Tu as laissé mysql_query :'(
enlève-le hein.

<?php
require 'inc/config.php';
//On verifie que lidentifiant de lutilisateur est defini
if (isset($_GET['id']))
{
  $id = intval($_GET['id']);

  // On regarde si l'utilisateur a déjà le badge
  $req0 = $pdo->prepare('SELECT *
                         FROM sn_votes
                         WHERE id_membre = ?
                            AND id_badge = ?
                        ');

  $req0->execute([$id, $id_badge]); // je ne sais pas comment on récupère le "id_badge" du badge que tu es en train de rechercher, à toi d'adapter

  $badge_existe = $req0->rowCount() != 0 ? true : false;
}
?>
<?php
if ($_GET['snoop'] === "1")
{
   require_once 'inc/db.php';
    $id = $dnn['id'];

    $req = $pdo->prepare("UPDATE users_snapub SET like_count = like_count+1 WHERE id = ?");
    $req->execute([$id]);

    // on ajoute le badge seulement s'il n'existait pas déjà
    if (!$badge_existe)
    {
       $req2 = $pdo->prepare("INSERT INTO sn_users_badges SET user_id = ?, badge_id = '9', desc_badge = 'Voter pour la première fois', date_attribution = NOW()");
        $req2->execute(array($_GET['id_membre']));
    }

    $req3 = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
    $req3->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));

    // setcookie('2758257275365453_'.$id, 'true', time()+24000000);
    header("Location: $_SERVER[HTTP_REFERER]");
    exit();
}
?>

Effectivement, si le cookie servait à ça, tu peux t'en passer, et vérifier la base de données, pas de soucis.

Et non désolé pas de skype.

Hey SLK,

J'ai modifié un peu le code car la verification pour savoir si l'utilisateur à déjà le badge est fausse,
Enfait il y'a 3 tables,

Celles de tout les membres, users_snapub (la ou ont récupère juste l'id qui nous interrèsse)
Celle de tout les votes, sn_votes (id_membre, id_voter, membre_voter, date_vote)
Celle de tout les badges débloquées, sn_users_badges (user_id, badge_id, desc_badge, date_attribution)

La sa bloque sur une erreur 500 malheureusement et j'arrive pas à trouvé ou...

Et le id_badge la en l'occurance il correspond à 9

<?php
require 'inc/config.php';
//On verifie que lidentifiant de lutilisateur est defini
if (isset($_GET['id']))
{
  $id = intval($_SESSION['auth']->id);

  // On regarde si l'utilisateur a déjà le badge
  $id_badge = 9;
  $req0 = $pdo->prepare('SELECT * FROM sn_users_badges WHERE user_id = ? AND id_badge = ?');
  $req0->execute([$id, $id_badge]); // je ne sais pas comment on récupère le "id_badge" du badge que tu es en train de rechercher, à toi d'adapter

  $badge_existe = $req0->rowCount() != 0 ? true : false;
}
?>
<?php
if ($_GET['snoop'] === "1")
{
   require_once 'inc/db.php';
    $id = $dnn['id'];

    $req = $pdo->prepare("UPDATE users_snapub SET like_count = like_count+1 WHERE id = ?");
    $req->execute([$id]);

    // on ajoute le badge seulement s'il n'existait pas déjà
    if (!$badge_existe)
    {
       $req2 = $pdo->prepare("INSERT INTO sn_users_badges SET user_id = ?, badge_id = '9', desc_badge = 'Voter pour la première fois', date_attribution = NOW()");
       $req2->execute(array($_GET['id_membre']));
    }

    $req3 = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
    $req3->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));

    // setcookie('2758257275365453_'.$id, 'true', time()+24000000);
    header("Location: $_SERVER[HTTP_REFERER]");
    exit();
}
?>

J'ai réadapter le code :
Sa à l'air de fonctionner car il n'y à plus l'erreur 500 mais la première partie du code ne fonctionne toujours pas,
J'ai déjà reperer d'ou venais le problème, le code qui ne fonctionne pas :

<?php
require 'inc/db.php';
//On verifie que lidentifiant de lutilisateur est defini
if (isset($_GET['id']))
{
  $id = intval($_SESSION['auth']->id);

  // On regarde si l'utilisateur a déjà le badge
  $id_badge = "9";
  $req0 = $pdo->prepare('SELECT * FROM sn_users_badges WHERE user_id = ? AND id_badge = ?');
  $req0->execute([$id, $id_badge]); // je ne sais pas comment on récupère le "id_badge" du badge que tu es en train de rechercher, à toi d'adapter

  $badge_existe = $req0->rowCount() != 0 ? true : false;
}
?>

Et le code que j'ai réussi à adapter :

<?php
if ($_GET['snoop'] === "1")
{
   require_once 'inc/db.php';
    $id2 = $_GET['id'];

    $req = $pdo->prepare("UPDATE users_snapub SET like_count = like_count+1 WHERE id = ?");
    $req->execute([$id2]);

    // on ajoute le badge seulement s'il n'existait pas déjà
    if (!$badge_existe)
    {
       $req2 = $pdo->prepare("INSERT INTO sn_users_badges SET user_id = ?, badge_id = '9', desc_badge = 'Voter pour la première fois', date_attribution = NOW()");
       $req2->execute(array($_GET['id_membre']));
    }

    $req3 = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
    $req3->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));

    // setcookie('2758257275365453_'.$id, 'true', time()+24000000);
    header("Location: $_SERVER[HTTP_REFERER]");
    exit();
}
?>