IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

système de vote [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut système de vote
    Bonjour à tous,

    Voilà, j'ai fait un système de vote avec restriction dans le temps (un vote toute les 2H), mais le souci est que quand un membre vote, ça bloque tout les autres. Dans la BDD, ça ne veut pas faire la différence entre le guid d'un membre par rapport à un autre.
    J'ai essayé plein de "bidouille" mais rien ne veut y faire, avez-vous une solution à me proposer svp.?
    je vous transmet le code.
    Merci d'avance de vos réponses.

    Cordialement
    Vazer7070

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    // recupération de la ligne de vote de l'utilisateur
            $sql = $db1->prepare("SELECT time FROM votes WHERE ip=?");
            $retour = $sql->execute([$_SESSION['id']]);
            if ($retour) { // la requête s'est bien passée
                $data = $sql->fetch(PDO::FETCH_ASSOC); // ligne sous forme de tableau associatif
     
                $now = time();
                // le temps enregistré est il supérieur à maintenant ?
                if($data['time'] > $now) { // oui il est supérieur le vote n'est pas possible
                    // temps restant à attendre avant le prochain vote
                    $time_calc = ceil(((int) $data['time'] - $now) / 60);
     
                    echo "<fieldset class=\"erreur\"><p class=\"red\">Vous devez attendre " . $time_calc . " minutes avant de pouvoir revoter !</p></fieldset>\n";
     
                } else { // non le temps enregistré est inférieur à maintenant, l'utilisateur peut revoter
     
                    //
     
     
                    // ici traitement du nouveau vote
                    // ...
     
                }
     
     
     
            } else {
     
                // traitement de l'erreur de la requête
                // ...
            }
    		 $time_vote = 7200;
             $time_db = time() + $time_vote;
     $sql = "INSERT INTO votes (ip,time) VALUES ('".$_SERVER['REMOTE_ADDR']."', '".$time_db."')";
    		 $sql = $db1->prepare($sql);
    		 $sql->execute();
    		 $sql = "INSERT INTO votes (ip,time) VALUES ('".$_SESSION['id']."', '".$time_db."')";
    		 $sql = $db1->prepare($sql);
    		 $sql->execute();
    		$a = get_info($_SESSION['id'],'point');
    		$b = get_info($_SESSION['id'],'pts_vote');
    		$point1 = $vote + $a;
    		  $point2 = 1 + $b;
    		 $sql = "UPDATE accounts SET point=$point1 WHERE guid='".$_SESSION['id']."'";
    			$sql = $db2->prepare($sql);
    			$sql->execute();
     
    			$sql = "UPDATE accounts SET pts_vote=$point2 WHERE guid='".$_SESSION['id']."'";
    			$sql = $db2->prepare($sql);
    			$sql->execute();
    		 //header('Location:'.$rpg.'');
    		 echo '<meta http-equiv="refresh" content="0; url='.$rpg.'">';
     
     
    	  }
    	 ?>

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Est-ce que dans ta table les valeurs "time" sont bien différentes ?

    En tout cas c'est sûr que ton code est un peu en bazar, c'est difficile de suivre ce que tu fais à partir de la ligne 32.

    Pourquoi il y a deux requêtes d'INSERTION et deux requêtes d'UPDATE ?
    A quoi sert la fonction get_info() ?
    Est-ce que 'pts_vote' dans la session ça n'est pas simplement la valeur contenue dans la table ?
    Tu fais des requêtes préparées mais sans paramètres donc la préparation ne sert à rien.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    non elles ne le sont pas, la plupart du temps, une seule ligne se crée et fait loi pour tout les membres :-/

    oui, navré, comme je me suis pris la tête dessus pendant plusieurs heures, forcement, ça a mis le bazar :-/
    la fonction "get_info()", récupère les infos pour l'afficher sur la page.

    ben les 2 fonctions UPDATE, une s'occupe de "pts_vote" indiquant le nombre de fois où l'on vote et l'autre du nombre de points total^^
    (ce qui répond à ta questions sur "pts_vote" aussi)

    Si tu parles de la préparation de départ, c'est que normalement, c'est censé préparé en fonction du "guid" de chaque membre, mais ça ne le fait pas, que je mette "$_SESSION['id']" qui est l'équivalent des guid membre ou que je mette "tarte" ça fait pareil :-/

    et la doublure des fonctions INSERT, c’est pour insérer la confirmation du vote du dit membre effectuant l'action.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Bon concernant la partie UPDATE, si j'ai bien compris le fonctionnement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $a = get_info($_SESSION['id'],'point');
    		$b = get_info($_SESSION['id'],'pts_vote');
    		$point1 = $vote + $a;
    		  $point2 = 1 + $b;
    		 $sql = "UPDATE accounts SET point=$point1 WHERE guid='".$_SESSION['id']."'";
    			$sql = $db2->prepare($sql);
    			$sql->execute();
     
    			$sql = "UPDATE accounts SET pts_vote=$point2 WHERE guid='".$_SESSION['id']."'";
    			$sql = $db2->prepare($sql);
    			$sql->execute();
    se résume à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $db2->exec("UPDATE accounts SET point = point + $vote, pts_vote = pts_vote + 1 WHERE guid = " . $_SESSION['id']);
    Concernant les INSERT, tu as modifié le code dans le premier message et je comprends encore moins pourquoi il y a deux insertions.
    Quelle est la structure de cette table vote ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    ah oui effectivement, je me suis pris la tête pour rien Oo

    oui j'ai modifié le code, car il n'était pas comme ce que j'avais fait en dernier, je te fournis ma table "votes"
    tu vas voir la ligne qui s'inscrit constamment et qui par son unique présence cause le souci (son ip est celle qui s'affiche quelque soit le guid des membres)

    table

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si les votants sont identifiés par un id, que vient faire l'ip dans notre histoire ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    ben ip c’est la colonne de la table, il ne faut pas le mettre.?

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pourquoi tu n'identifies pas les vote par l'id de l'utilisateur ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Juste en passant, faudrait vraiment réfléchir à la question posée par sabotage...

    J'ai pas regardé en détail tout le sujet mas sachant qu'un ip n'est pas immuable et peut se changer facilement, cela semble très périlleux de s'en servir comme identifiant.

    Ou si besoin il faudrait créer dans ta table une clé composée au minimum du champ ip et d'un champ dateTime - qui enregistre l'heure exacte de l'enregistrement de l'ip - pour avoir une clé unique. Enfin bon c'est sans doute une autre histoire mais pour dire qu'un ip sans sa référence temporelle d'enregistrement est finalement anonyme.

  10. #10
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    ben je me servais du "guid" de la table accounts qui rentré dans la colonne "ip" de la table votes.
    Mais si ABCIWEB pense que ce n’est pas un bon moyen, comment dois-je procéder.?

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ah donc ton "guid" et donc $_SESSION['id'] ce sont des adresses ip ?

    Ca serait bien que tu nous exposes avec precision ce que tu fais et ton problème car la on te tire les vers du nez.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    ben le principe est simple :

    le membre arrive sur la page, il veut voter, donc il clique et ça le reconduit sur la page de vote, si il désire re-voter, il ne peut pas car le système le bloque pour 120min, après ce temps, il pourra sans soucis (fonctionnement normal)

    coté code:

    je prépare la BDD à comparer le guid du membre et la table "votes" dans la colonne "ip", si le guid du membre est dans la table, alors c'est qu'il a déjà voté (et doit donc attendre en fonction de "time"), sinon c'est bon il peut voter.

    j'insère dans la table "votes" la $_SESSION['id'] dans la colonne ip (donc ça correspond aux guids des membres présent dans la table "accounts" et non pas des adresses ip de PC).
    et en me servant de ce guid, ça permet aux dernières fonctions de d'insérer "points" qui est le nombre de points total (donc présent + obtenus par ce vote) et aussi de mettre "pts_vote" qui est le nombre de fois où ils ont votés. Ces 2 colonnes sont dans la table "accounts".

    les get_info() servent pour l'affichage des valeurs de "point" et "pts_vote" sur la page.

    j'espère avoir été assez clair la dans ce que je veux faire :-/

    Mon problème est le suivant:
    Dans le screen de la table que je vous est donné, vous voyez l'ip "::1", c'est cela qui s'ajoute à la place de ce qui est prévu et qui empêche non seulement un membre qui à voté (qui l'aurais mis initialement) mais aussi tout les autres comme si eux aussi avaient voté, en somme : A vote --> B, C et D sont bloqués mais aussi B (120min après A donc) vote --> A, C, D sont bloqué et ainsi de suite.

    je peux vous fournir une vidéo de ce qui se passe ce soir au besoin :-/

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Et donc du coup pourquoi la colonne s'appelle "ip" et pourquoi y mets-tu des adresses IP si ce qu'elle doit contenir sont les id des membres ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    ça s'appelle "ip" parce que je n'avais pas envie de m'y perdre avec plusieurs fois que je met "id" dans ma table. (oui le nom prête à confusion, je m'en excuse)
    et non, à aucun moment, ça ne met d'adresse ip ni ne doit en mettre.

    dans une table "accounts" suivante, ça met:

    guid username pass level vip
    25 vazer7070 test 1 0
    26 sabotage php 3 0

    et donc ça met le contenu de la première colonne (guid) dans la colonne "ip" de "votes" pour identifier chaque voteur normalement sauf que ça me met "::1" quoiqu'il arrive :-/

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $sql = "INSERT INTO votes (ip,time) VALUES ('".$_SERVER['REMOTE_ADDR']."', '".$time_db."')";
    $_SERVER['REMOTE_ADDR'] c'est l'adresse IP du visiteur, donc c'est bien toi l'insere.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  16. #16
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    me serais-je alors trompé de fonction.?Oo
    C'est fort possible oui...

    je fais comment du coup, car je ne veux pas l'adresse ip :-/

  17. #17
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est ce que je te dis depuis le début, il ne faut que l'INSERT avec l'id de l'utilisateur.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  18. #18
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    Avec cette ligne en moins, c’est bien le guid qui s'inscrit, plus de souci à ce niveau, sauf que ça ne bloque plus du tout les votes :-/

  19. #19
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu peux nous redonner ton code actuel qu'on voit ou on en est ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  20. #20
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    et voici^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    {
     
            // recupération de la ligne de vote de l'utilisateur
            $sql = $db1->prepare("SELECT time FROM votes WHERE ip=");
            $retour = $sql->execute([$_SESSION['id']]);
            if ($retour) { // la requête s'est bien passée
                $data = $sql->fetch(PDO::FETCH_ASSOC); // ligne sous forme de tableau associatif
     
                $now = time();
                // le temps enregistré est il supérieur à maintenant ?
                if($data['time'] > $now) { // oui il est supérieur le vote n'est pas possible
                    // temps restant à attendre avant le prochain vote
                    $time_calc = ceil(((int) $data['time'] - $now) / 60);
     
                    echo "<fieldset class=\"erreur\"><p class=\"red\">Vous devez attendre " . $time_calc . " minutes avant de pouvoir revoter !</p></fieldset>\n";
     
                } else { // non le temps enregistré est inférieur à maintenant, l'utilisateur peut revoter
     
                    //
     
     
                    // ici traitememt du nouveau vote
                    // ...
     
                }
     
     
     
            } else {
     
                // traitement de l'erreur de la requête
                // ...
            }
    		 $time_vote = 7200;
             $time_db = time() + $time_vote;
    		 $sql = "INSERT INTO votes (ip,time) VALUES ('".$_SESSION['id']."', '".$time_db."')";
    		 $sql = $db1->prepare($sql);
    		 $sql->execute();
    		$a = get_info($_SESSION['id'],'point');
    		$b = get_info($_SESSION['id'],'pts_vote');
    		$point1 = $vote + $a;
    		  $point2 = 1 + $b;
    		 $sql = "UPDATE accounts SET point=$point1 WHERE guid='".$_SESSION['id']."'";
    			$sql = $db2->prepare($sql);
    			$sql->execute();
     
    			$sql = "UPDATE accounts SET pts_vote=$point2 WHERE guid='".$_SESSION['id']."'";
    			$sql = $db2->prepare($sql);
    			$sql->execute();
    		 //header('Location:'.$rpg.'');
    		 echo '<meta http-equiv="refresh" content="0; url='.$rpg.'">';
     
     
    	  }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Système] Système de vote sécurisé
    Par mathieu3392 dans le forum Langage
    Réponses: 4
    Dernier message: 22/11/2007, 15h18
  2. Système de votes
    Par Auden dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/05/2007, 14h27
  3. [AJAX] système de vote ajax
    Par sisco97 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/05/2007, 04h52
  4. [Système] Questions système de votes
    Par masseur dans le forum Langage
    Réponses: 2
    Dernier message: 03/10/2006, 16h47
  5. [MySQL] Système de votes (pour les membres) : cmt le créer ?
    Par yazerty dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 20/02/2006, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo