Hey !
Je rencontre un petit problème avec mon code,

Ce que je fais

Voici mon code INSERT, les données sont envoyées depuis un formulaire par method GET :

<?php
  if(!empty($_GET['snoop'] === "1")){
     require_once 'inc/db.php';
        $req = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
        $req->execute($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']);
        header("Location: $_SERVER[HTTP_REFERER]");
        exit();
    } ?>

Et voici mon formulaire GET :

<form id="snoop" action="" method="GET">
   <input type="hidden" name="id" id="id" value="<?php echo $dnn['id']; ?>">
      <input type="hidden" name="snoop" id="snoop" value="1">
         <input type="hidden" name="id_voter" id="id_voter" value="<?php echo $dnn['id']; ?>">
            <input type="hidden" name="id_membre" id="id_membre" value="<?php echo $_SESSION['auth']->id; ?>">
               <input type="hidden" name="membre_voter" id="membre_voter" value="<?php echo $dnn['username']; ?>">
                  <h3><input class="a-ruby" type="image" style="width:50px" src="assets/img/snoop.png">
                     <?= $dnn['like_count']; ?> Votes</h3>
  </form>

Ce que je veux

J'aimerai que l'insertion se fasse correctement c'est à dire avec les valeurs id_voter, id_membre, membre_voter...

Ce que j'obtiens

Le code est est executé correctement mais aucune insertion au niveau de la base de données...

19 réponses


ACDesign27
Auteur
Réponse acceptée

Re LSK !

Et merci neecride pour ta réponse,
Malheureusement sa ne va pas avec ce code..

Malgrés sa, j'ai reussi à trouver l'erreur lol, encore une connerie ^^
Voici mon code après minte adaptation et corrections, mais maintenant il fonctionne !

<?php
if (!empty($_GET['snoop']) && $_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();
}
?>

J'ai supprimé la $req2 car elle étais totalement faussée enfait... Je sais même pas comment j'ai pue passer à côté de sa !
Enfait les points de vote sont situé dans la table users_snapub et dans la table sn_votes j'enregistre juste les faits et geste des membres pour leur historique personnel vous voyez ? :)

Donc dans la table users_snapub nous avons : pierrot501,
pierrot501 à 58 Votes actuellement,
Lorsque quelqu'un vote pour lui nous demandons à php si,
(( ''125'' est l'id de pierrot501 )) Les variables $_GET sont correctement remplit << profile.php?id=125&snoop=1 >>
Si c'est le cas, alors nous allons demander à php d'executer une requête UPDATE
dans la table users_snapub, la table ou se situe tous nos membres ainsi que leurs nombres de votes. Nous rajoutons donc +1 points dans notre table users_snapub puis nous allons demander à php d'executer une seconde requête preparée afin d'enregistrer les informations sn_votes sert à enregistrer l'historique des de ce vote dans la table sn_votes,
votes de nos membres Avec les valeurs suivantes, nous voulont : l'id du membre qui à voter pour pierrot501,
'id_voter' l'id du membre votée (Pierrot501 cette fois-ci donc l'id_voter serra '125',
'membre_voter' le nom d'utilisateur du membre qui à été votée c'est à dire 'Pierrot501',
Ainsi que la date du vote.

Voila pour resumé,

Desolé pour ce lourds monologue mais j'avais besoin de me clarifié ^^
C'est beaucoup plus clair maintenant pour vous que pour moi,

Maintenant sans vouloir vous souller avec mes requêtes j'aimerais pouvoir rajouter une condition,
Cette condition serra pour les membres qui vote pour la première fois...
En l'occurence ils débloqueront un succès qui se nommera "1er Vote !" par exemple

Donc pour vous donner une id de la condition que je souhaiterai rajouter voici un petit exemple,

Si (if) id_membre === $_SESSION['auth']->id {
Alors, il executera les deux requêtes standards,
}
Et si,

L'id de la SESSION du membre n'est pas trouver dans la table sn_votes,

Alors, il executera trois requêtes,
Les deux requêtes standards + Une requête d'ajout de badge dans la table sn_users_badges ^^

Voila Voila j'espère que mes explications vous aurront plus, merci encore à vous deux !

ton if est faux.
if(!empty($_GET['snoop'] === "1")){
remplace par ca
if(isset($_GET['snoop']) && $_GET['snoop'] === "1"){
que tu peux traduire par : Si j'ai un $_GET['snoop'] et que $_GET['snoop'] est strictement egale a "1"

Hey keulu !

Merci pour ta réponse, j'ai modifier mon if.. Le code fonctionne toujours mais toujours aucune insertion :/

et si tu met un echo dans ton if, tu rentres dedans ?

ah un autre truc...

$req->execute($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']); Prend un tableau en parametre.

donc a remplacer par :

$req->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));

Toujours pas... :/

<?php
  if(isset($_GET['snoop']) && $_GET['snoop'] === "1"){
     require_once 'inc/db.php';
        $req = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
        $req->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));
        header("Location: $_SERVER[HTTP_REFERER]");
        exit();
    } ?>

vérifie que tu rentre bien dans ton if, et fait des var dump variable par variable pour voir ou ca coince

verifie aussi le message d'erreur eventuel de ta base de donnée avec :

try {
    $req = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
    $req->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));
}
catch( PDOException $Exception ) {
    var_dump($Exception->getMessage( ));
    throw new MyDatabaseException( $Exception->getMessage( ) , $Exception->getCode( ) );
}

J'ai certainement trouver,

parceque j'ai plusieurs script qui s'execute avec cette variable if['snoop']
et les deux premiers scripts sont suivi d'un

header("Location: $_SERVER[HTTP_REFERER]");
   exit();

Donc à mon avis je pense qu'il prend cette header en charge avant d'executer le dernier script du bas, non ?

Voici le script au complet :

<?php
  if(!empty($_GET['snoop'] === "1")){
    require_once 'inc/db.php';
    if($_SERVER[HTTP_REFERER] != $dnnn['ip_dernier_snooper']){
    $id = $_GET['id'];
    $req = $pdo->prepare("UPDATE users_snapub SET like_count = like_count+1 WHERE id = ?");
    $req->execute([$id]);
    setcookie('2758257275365453_'.$id, 'true', time()+24000000);
    header ("Location: $_SERVER[HTTP_REFERER]" );
    exit();
    }
  } 
  if(!empty($_GET['snoop'] === "1")){
    require_once 'inc/db.php';
    if($_SERVER[HTTP_REFERER] != $dnnn['ip_dernier_snooper']){
    $id = $_GET['id'];
    $req = $pdo->prepare("UPDATE sn_votes SET like_count = like_count+1 WHERE id = ?");
    $req->execute([$id]);
    setcookie('2758257275365453_'.$id, 'true', time()+24000000);
    header("Location: $_SERVER[HTTP_REFERER]");
    exit();
    }
  } 
  if(isset($_GET['snoop']) && $_GET['snoop'] === "1"){
     require_once 'inc/db.php';
        $req = $pdo->prepare("INSERT INTO sn_votes SET id_membre = ?, id_voter = ?, membre_voter = ?, date_vote = NOW()");
        $req->execute(array($_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter']));
        header("Location: $_SERVER[HTTP_REFERER]");
        exit();
    } ?>

Salut,

Ben... Oui...
Tu as écris exactement la même chose pour les 2 1ers...

  if(!empty($_GET['snoop'] === "1")){
    require_once 'inc/db.php';
    if($_SERVER[HTTP_REFERER] != $dnnn['ip_dernier_snooper']){

C'est clair que le UPDATE sn_votes ne sera JAMAIS exécuté...

Ensuite on regarde le 3ème... C'est plus ou moins la même chose,
parce-que s'il est !empty, alors il est forcément isset,
donc le INSERT INTO sn_votes ne sera JAMAIS exécuté non plus.

Du coup on se dit qu'il faut regrouper les 3 requêtes, mais vu ce qu'elles font ça n'aurait aucun sens...

Maintenant qu'on à le code, donne nous "l'idée" que tu essaie de faire, sans code, juste avec des phrases.
Peut-être qu'on comprendra mieux.

Je pense savoir pourquoi ça fonctionne pas. Tu sais pas faire de requête INSERT

Tu as mit
INSERT INTO sn_votes SET ...
Alors qu'il faut mettre
INSERT INTO sn_votes(id_membre, id_voter, membre_voter, date_vote) VALUES(?, ?, ?, NOW())

T'as confondu la requête d'UPDATE avec celle d'INSERT

Après en php tu fais $db->execute([ $_GET['id_membre'], $_GET['id_voter'], $_GET['membre_voter'] ])

insert into table set champ='toto' est une syntaxe valide ;)

@plus

@Pierrot01, Effectivement, je viens de vérifier, mais c'est MySQL only, c'est préférable d'utiliser du SQL standard

Hello ! Merci pour vos réponses !!

Pour te répondre SLK je souhaite que quand un utilisateur appuie sur le bouton coeur "pour donner un vote en gros" rajoute +1 votes dans la table d'utilisateur qui est "sn_users" dans la colonne "like_count" puis qu'il execute un INSERT dans la table "sn_votes" avec "id_membre" l'id du membre qui à attribué le vote, "id_voter" l'id du membre voté, "username_voter" le nom d'utilisateur du membre voté ainsi que le date d'attribution du vote ^^

Voila voila j'espère que vous aurrez compris ^^
Merci encore !

Ah, alors du coup, peut-être un truc dans ce genre là :

if (!empty($_GET['snoop']) && $_GET['snoop'] === "1") // note : j'ai modifié un peu cette ligne, elle était légèrement mal construite.
{
    require_once 'inc/db.php';
    if ($_SERVER[HTTP_REFERER] != $dnnn['ip_dernier_snooper'])
    {
        $id = $_GET['id'];

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

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

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

        header("Location: $_SERVER[HTTP_REFERER]");
        exit();
    }
}

il faut vérifier que toutes ces variables existent bien (mais si ça se trouve tu l'a déjà fait) :
$dnnn['ip_dernier_snooper']
$_GET['id']
$_GET['id_membre']
$_GET['id_voter']
$_GET['membre_voter']

Hey LSK !

Merci beaucoup pour ton retour aussi bien detaillés,
malgrès plusieurs manipulation... J'ai tenter d'adapter ta correction à mon cas et toujours bloqué...
Je ne trouve pas d'ou viens le souci,
Le code est executée jusqu'a l'ajout de +1 points dans "like_count"...
Ensuite les deux autres requetes sont ignorer et la redirection ne se fait pas non plus ce qui fait que je suis redirigée vers une erreur 500..

Voici le code de LSK avec quelques modifications :

<?php
if (!empty($_GET['snoop']) && $_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("UPDATE sn_votes SET like_count = like_count+1 WHERE id = ?");
        $req2->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('27578_'.$id, 'true', time()+24000000);
        header("Location: $_SERVER[HTTP_REFERER]");
        exit();
}
?>

zut,
tu dis que le 1er UPDATE se fait, mais pas le 2ème ? (sans parler du reste)
Mince, je ne vois pas pourquoi non plus...

Le but c'est de faire un sistème de like ?

voila pour exemple de mon forum ce que je fait pour incrémenter un compteur de vue, ça fonctionne chez moi et un insert ne sert a rien puisque il part directement de 0 et incrémente de 1 jusque xxx :

/**********
* UPDATE count view
***********/
if(isset($_SESSION['auth']) && isset($_GET['id'])){

    $vu = [intval($_GET['id'])];

    $sql = $db->prepare("UPDATE f_topics SET f_topic_vu = f_topic_vu + 1 WHERE id = ?")->execute($vu); 
}

La tu a juste a remplacer le if et creer un boutton get qui vaudra like en value

exemple :

if(isset($_SESSION['auth']) && isset($_GET['like'])){ // laisse le auth si tu veut que seul les inscrit puisse voter
    checkCsrf();
    $vu = [intval($_GET['like'])]; //tu le remplace par l'id de ton article

    $sql = $db->prepare("UPDATE sn_votes SET like_count = like_count + 1 WHERE id = ?")->execute($vu); 
    //tu fait un redirection tu peut faire de l'ajax aussi 
}

Un bouton like (je part du primcipe que tu a une protection csrf) :

<a href="<?php echo WEBROOT; ?>index.php?page=article&like=<?php echo $article->id; ?>&<?php echo csrf(); ?>" title="Liker"><span class="glyphicon glyphicon-ok"></span></a>

Normalement ça devrais fonctionner !! j'utilise ce système tous le temps pour gere des paramètre etc... et ça marche a chaque fois.

Re !

J'ai tenté de rajouter la condition dans mon code est le voici maintenant :

<?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
  }
}
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 = ghbfffg, 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();
} elseif (!empty($_GET['snoop']) && $_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();
}
?>

Il fonctionne toujours correctement, mais la le problème c'est que sa ne fonctionne qu'a moitié ^^
L'ajout de +1 points fonctionne, donc la première requête fonctionne bien
mais la requête 2 que j'ai rajouté dans ma première condition est ignoré...

C'est à dire que si mon id n'apparait pas dans la colonne id_membre de la table sn_votes alors mon succèes n'est pas debloquer donc l'ajout de la requête 2 n'est pas correcte... :/
J'ai essayer avec un elseif comme vous pouvez le voir mais sa ne fonctionne pas...